Source file src/pkg/math/big/int.go
1
2
3
4
5
6
7 package big
8
9 import (
10 "errors"
11 "fmt"
12 "io"
13 "math/rand"
14 "strings"
15 )
16
17
18
19 type Int struct {
20 neg bool
21 abs nat
22 }
23
24 var intOne = &Int{false, natOne}
25
26
27
28
29
30
31
32 func (x *Int) Sign() int {
33 if len(x.abs) == 0 {
34 return 0
35 }
36 if x.neg {
37 return -1
38 }
39 return 1
40 }
41
42
43 func (z *Int) SetInt64(x int64) *Int {
44 neg := false
45 if x < 0 {
46 neg = true
47 x = -x
48 }
49 z.abs = z.abs.setUint64(uint64(x))
50 z.neg = neg
51 return z
52 }
53
54
55 func (z *Int) SetUint64(x uint64) *Int {
56 z.abs = z.abs.setUint64(x)
57 z.neg = false
58 return z
59 }
60
61
62 func NewInt(x int64) *Int {
63 return new(Int).SetInt64(x)
64 }
65
66
67 func (z *Int) Set(x *Int) *Int {
68 if z != x {
69 z.abs = z.abs.set(x.abs)
70 z.neg = x.neg
71 }
72 return z
73 }
74
75
76
77
78
79
80 func (x *Int) Bits() []Word {
81 return x.abs
82 }
83
84
85
86
87
88
89 func (z *Int) SetBits(abs []Word) *Int {
90 z.abs = nat(abs).norm()
91 z.neg = false
92 return z
93 }
94
95
96 func (z *Int) Abs(x *Int) *Int {
97 z.Set(x)
98 z.neg = false
99 return z
100 }
101
102
103 func (z *Int) Neg(x *Int) *Int {
104 z.Set(x)
105 z.neg = len(z.abs) > 0 && !z.neg
106 return z
107 }
108
109
110 func (z *Int) Add(x, y *Int) *Int {
111 neg := x.neg
112 if x.neg == y.neg {
113
114
115 z.abs = z.abs.add(x.abs, y.abs)
116 } else {
117
118
119 if x.abs.cmp(y.abs) >= 0 {
120 z.abs = z.abs.sub(x.abs, y.abs)
121 } else {
122 neg = !neg
123 z.abs = z.abs.sub(y.abs, x.abs)
124 }
125 }
126 z.neg = len(z.abs) > 0 && neg
127 return z
128 }
129
130
131 func (z *Int) Sub(x, y *Int) *Int {
132 neg := x.neg
133 if x.neg != y.neg {
134
135
136 z.abs = z.abs.add(x.abs, y.abs)
137 } else {
138
139
140 if x.abs.cmp(y.abs) >= 0 {
141 z.abs = z.abs.sub(x.abs, y.abs)
142 } else {
143 neg = !neg
144 z.abs = z.abs.sub(y.abs, x.abs)
145 }
146 }
147 z.neg = len(z.abs) > 0 && neg
148 return z
149 }
150
151
152 func (z *Int) Mul(x, y *Int) *Int {
153
154
155
156
157 z.abs = z.abs.mul(x.abs, y.abs)
158 z.neg = len(z.abs) > 0 && x.neg != y.neg
159 return z
160 }
161
162
163
164
165 func (z *Int) MulRange(a, b int64) *Int {
166 switch {
167 case a > b:
168 return z.SetInt64(1)
169 case a <= 0 && b >= 0:
170 return z.SetInt64(0)
171 }
172
173
174 neg := false
175 if a < 0 {
176 neg = (b-a)&1 == 0
177 a, b = -b, -a
178 }
179
180 z.abs = z.abs.mulRange(uint64(a), uint64(b))
181 z.neg = neg
182 return z
183 }
184
185
186 func (z *Int) Binomial(n, k int64) *Int {
187 var a, b Int
188 a.MulRange(n-k+1, n)
189 b.MulRange(1, k)
190 return z.Quo(&a, &b)
191 }
192
193
194
195
196 func (z *Int) Quo(x, y *Int) *Int {
197 z.abs, _ = z.abs.div(nil, x.abs, y.abs)
198 z.neg = len(z.abs) > 0 && x.neg != y.neg
199 return z
200 }
201
202
203
204
205 func (z *Int) Rem(x, y *Int) *Int {
206 _, z.abs = nat(nil).div(z.abs, x.abs, y.abs)
207 z.neg = len(z.abs) > 0 && x.neg
208 return z
209 }
210
211
212
213
214
215
216
217
218
219
220
221
222
223 func (z *Int) QuoRem(x, y, r *Int) (*Int, *Int) {
224 z.abs, r.abs = z.abs.div(r.abs, x.abs, y.abs)
225 z.neg, r.neg = len(z.abs) > 0 && x.neg != y.neg, len(r.abs) > 0 && x.neg
226 return z, r
227 }
228
229
230
231
232 func (z *Int) Div(x, y *Int) *Int {
233 y_neg := y.neg
234 var r Int
235 z.QuoRem(x, y, &r)
236 if r.neg {
237 if y_neg {
238 z.Add(z, intOne)
239 } else {
240 z.Sub(z, intOne)
241 }
242 }
243 return z
244 }
245
246
247
248
249 func (z *Int) Mod(x, y *Int) *Int {
250 y0 := y
251 if z == y || alias(z.abs, y.abs) {
252 y0 = new(Int).Set(y)
253 }
254 var q Int
255 q.QuoRem(x, y, z)
256 if z.neg {
257 if y0.neg {
258 z.Sub(z, y0)
259 } else {
260 z.Add(z, y0)
261 }
262 }
263 return z
264 }
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281 func (z *Int) DivMod(x, y, m *Int) (*Int, *Int) {
282 y0 := y
283 if z == y || alias(z.abs, y.abs) {
284 y0 = new(Int).Set(y)
285 }
286 z.QuoRem(x, y, m)
287 if m.neg {
288 if y0.neg {
289 z.Add(z, intOne)
290 m.Sub(m, y0)
291 } else {
292 z.Sub(z, intOne)
293 m.Add(m, y0)
294 }
295 }
296 return z, m
297 }
298
299
300
301
302
303
304
305 func (x *Int) Cmp(y *Int) (r int) {
306
307
308
309
310 switch {
311 case x.neg == y.neg:
312 r = x.abs.cmp(y.abs)
313 if x.neg {
314 r = -r
315 }
316 case x.neg:
317 r = -1
318 default:
319 r = 1
320 }
321 return
322 }
323
324 func (x *Int) String() string {
325 switch {
326 case x == nil:
327 return "<nil>"
328 case x.neg:
329 return "-" + x.abs.decimalString()
330 }
331 return x.abs.decimalString()
332 }
333
334 func charset(ch rune) string {
335 switch ch {
336 case 'b':
337 return lowercaseDigits[0:2]
338 case 'o':
339 return lowercaseDigits[0:8]
340 case 'd', 's', 'v':
341 return lowercaseDigits[0:10]
342 case 'x':
343 return lowercaseDigits[0:16]
344 case 'X':
345 return uppercaseDigits[0:16]
346 }
347 return ""
348 }
349
350
351 func writeMultiple(s fmt.State, text string, count int) {
352 if len(text) > 0 {
353 b := []byte(text)
354 for ; count > 0; count-- {
355 s.Write(b)
356 }
357 }
358 }
359
360
361
362
363
364
365
366
367
368
369
370
371 func (x *Int) Format(s fmt.State, ch rune) {
372 cs := charset(ch)
373
374
375 switch {
376 case cs == "":
377
378 fmt.Fprintf(s, "%%!%c(big.Int=%s)", ch, x.String())
379 return
380 case x == nil:
381 fmt.Fprint(s, "<nil>")
382 return
383 }
384
385
386 sign := ""
387 switch {
388 case x.neg:
389 sign = "-"
390 case s.Flag('+'):
391 sign = "+"
392 case s.Flag(' '):
393 sign = " "
394 }
395
396
397 prefix := ""
398 if s.Flag('#') {
399 switch ch {
400 case 'o':
401 prefix = "0"
402 case 'x':
403 prefix = "0x"
404 case 'X':
405 prefix = "0X"
406 }
407 }
408
409
410 digits := x.abs.string(cs)
411
412
413 var left int
414 var zeroes int
415 var right int
416
417
418 precision, precisionSet := s.Precision()
419 if precisionSet {
420 switch {
421 case len(digits) < precision:
422 zeroes = precision - len(digits)
423 case digits == "0" && precision == 0:
424 return
425 }
426 }
427
428
429 length := len(sign) + len(prefix) + zeroes + len(digits)
430 if width, widthSet := s.Width(); widthSet && length < width {
431 switch d := width - length; {
432 case s.Flag('-'):
433
434 right = d
435 case s.Flag('0') && !precisionSet:
436
437 zeroes = d
438 default:
439
440 left = d
441 }
442 }
443
444
445 writeMultiple(s, " ", left)
446 writeMultiple(s, sign, 1)
447 writeMultiple(s, prefix, 1)
448 writeMultiple(s, "0", zeroes)
449 writeMultiple(s, digits, 1)
450 writeMultiple(s, " ", right)
451 }
452
453
454
455
456
457
458
459
460
461
462
463
464 func (z *Int) scan(r io.RuneScanner, base int) (*Int, int, error) {
465
466 ch, _, err := r.ReadRune()
467 if err != nil {
468 return nil, 0, err
469 }
470 neg := false
471 switch ch {
472 case '-':
473 neg = true
474 case '+':
475 default:
476 r.UnreadRune()
477 }
478
479
480 z.abs, base, err = z.abs.scan(r, base)
481 if err != nil {
482 return nil, base, err
483 }
484 z.neg = len(z.abs) > 0 && neg
485
486 return z, base, nil
487 }
488
489
490
491
492 func (z *Int) Scan(s fmt.ScanState, ch rune) error {
493 s.SkipSpace()
494 base := 0
495 switch ch {
496 case 'b':
497 base = 2
498 case 'o':
499 base = 8
500 case 'd':
501 base = 10
502 case 'x', 'X':
503 base = 16
504 case 's', 'v':
505
506 default:
507 return errors.New("Int.Scan: invalid verb")
508 }
509 _, _, err := z.scan(s, base)
510 return err
511 }
512
513
514
515 func (x *Int) Int64() int64 {
516 v := int64(x.Uint64())
517 if x.neg {
518 v = -v
519 }
520 return v
521 }
522
523
524
525 func (x *Int) Uint64() uint64 {
526 if len(x.abs) == 0 {
527 return 0
528 }
529 v := uint64(x.abs[0])
530 if _W == 32 && len(x.abs) > 1 {
531 v |= uint64(x.abs[1]) << 32
532 }
533 return v
534 }
535
536
537
538
539
540
541
542
543
544
545 func (z *Int) SetString(s string, base int) (*Int, bool) {
546 r := strings.NewReader(s)
547 _, _, err := z.scan(r, base)
548 if err != nil {
549 return nil, false
550 }
551 _, _, err = r.ReadRune()
552 if err != io.EOF {
553 return nil, false
554 }
555 return z, true
556 }
557
558
559
560 func (z *Int) SetBytes(buf []byte) *Int {
561 z.abs = z.abs.setBytes(buf)
562 z.neg = false
563 return z
564 }
565
566
567 func (x *Int) Bytes() []byte {
568 buf := make([]byte, len(x.abs)*_S)
569 return buf[x.abs.bytes(buf):]
570 }
571
572
573
574 func (x *Int) BitLen() int {
575 return x.abs.bitLen()
576 }
577
578
579
580
581 func (z *Int) Exp(x, y, m *Int) *Int {
582 if y.neg || len(y.abs) == 0 {
583 return z.SetInt64(1)
584 }
585
586
587 var mWords nat
588 if m != nil {
589 mWords = m.abs
590 }
591
592 z.abs = z.abs.expNN(x.abs, y.abs, mWords)
593 z.neg = len(z.abs) > 0 && x.neg && y.abs[0]&1 == 1
594 return z
595 }
596
597
598
599
600
601 func (z *Int) GCD(x, y, a, b *Int) *Int {
602 if a.Sign() <= 0 || b.Sign() <= 0 {
603 z.SetInt64(0)
604 if x != nil {
605 x.SetInt64(0)
606 }
607 if y != nil {
608 y.SetInt64(0)
609 }
610 return z
611 }
612 if x == nil && y == nil {
613 return z.binaryGCD(a, b)
614 }
615
616 A := new(Int).Set(a)
617 B := new(Int).Set(b)
618
619 X := new(Int)
620 Y := new(Int).SetInt64(1)
621
622 lastX := new(Int).SetInt64(1)
623 lastY := new(Int)
624
625 q := new(Int)
626 temp := new(Int)
627
628 for len(B.abs) > 0 {
629 r := new(Int)
630 q, r = q.QuoRem(A, B, r)
631
632 A, B = B, r
633
634 temp.Set(X)
635 X.Mul(X, q)
636 X.neg = !X.neg
637 X.Add(X, lastX)
638 lastX.Set(temp)
639
640 temp.Set(Y)
641 Y.Mul(Y, q)
642 Y.neg = !Y.neg
643 Y.Add(Y, lastY)
644 lastY.Set(temp)
645 }
646
647 if x != nil {
648 *x = *lastX
649 }
650
651 if y != nil {
652 *y = *lastY
653 }
654
655 *z = *A
656 return z
657 }
658
659
660
661
662 func (z *Int) binaryGCD(a, b *Int) *Int {
663 u := z
664 v := new(Int)
665
666
667 switch {
668 case len(a.abs) > len(b.abs):
669 u.Set(b)
670 v.Rem(a, b)
671 case len(a.abs) < len(b.abs):
672 u.Set(a)
673 v.Rem(b, a)
674 default:
675 u.Set(a)
676 v.Set(b)
677 }
678
679
680 if len(v.abs) == 0 {
681 return u
682 }
683
684
685
686 k := u.abs.trailingZeroBits()
687 if vk := v.abs.trailingZeroBits(); vk < k {
688 k = vk
689 }
690 u.Rsh(u, k)
691 v.Rsh(v, k)
692
693
694 t := new(Int)
695 if u.abs[0]&1 != 0 {
696
697 t.Neg(v)
698 } else {
699 t.Set(u)
700 }
701
702 for len(t.abs) > 0 {
703
704 t.Rsh(t, t.abs.trailingZeroBits())
705 if t.neg {
706 v.Neg(t)
707 } else {
708 u.Set(t)
709 }
710 t.Sub(u, v)
711 }
712
713 return u.Lsh(u, k)
714 }
715
716
717
718
719 func (x *Int) ProbablyPrime(n int) bool {
720 return !x.neg && x.abs.probablyPrime(n)
721 }
722
723
724 func (z *Int) Rand(rnd *rand.Rand, n *Int) *Int {
725 z.neg = false
726 if n.neg == true || len(n.abs) == 0 {
727 z.abs = nil
728 return z
729 }
730 z.abs = z.abs.random(rnd, n.abs, n.abs.bitLen())
731 return z
732 }
733
734
735
736 func (z *Int) ModInverse(g, p *Int) *Int {
737 var d Int
738 d.GCD(z, nil, g, p)
739
740
741 if z.neg {
742 z.Add(z, p)
743 }
744 return z
745 }
746
747
748 func (z *Int) Lsh(x *Int, n uint) *Int {
749 z.abs = z.abs.shl(x.abs, n)
750 z.neg = x.neg
751 return z
752 }
753
754
755 func (z *Int) Rsh(x *Int, n uint) *Int {
756 if x.neg {
757
758 t := z.abs.sub(x.abs, natOne)
759 t = t.shr(t, n)
760 z.abs = t.add(t, natOne)
761 z.neg = true
762 return z
763 }
764
765 z.abs = z.abs.shr(x.abs, n)
766 z.neg = false
767 return z
768 }
769
770
771
772 func (x *Int) Bit(i int) uint {
773 if i == 0 {
774
775 if len(x.abs) > 0 {
776 return uint(x.abs[0] & 1)
777 }
778 return 0
779 }
780 if i < 0 {
781 panic("negative bit index")
782 }
783 if x.neg {
784 t := nat(nil).sub(x.abs, natOne)
785 return t.bit(uint(i)) ^ 1
786 }
787
788 return x.abs.bit(uint(i))
789 }
790
791
792
793
794
795 func (z *Int) SetBit(x *Int, i int, b uint) *Int {
796 if i < 0 {
797 panic("negative bit index")
798 }
799 if x.neg {
800 t := z.abs.sub(x.abs, natOne)
801 t = t.setBit(t, uint(i), b^1)
802 z.abs = t.add(t, natOne)
803 z.neg = len(z.abs) > 0
804 return z
805 }
806 z.abs = z.abs.setBit(x.abs, uint(i), b)
807 z.neg = false
808 return z
809 }
810
811
812 func (z *Int) And(x, y *Int) *Int {
813 if x.neg == y.neg {
814 if x.neg {
815
816 x1 := nat(nil).sub(x.abs, natOne)
817 y1 := nat(nil).sub(y.abs, natOne)
818 z.abs = z.abs.add(z.abs.or(x1, y1), natOne)
819 z.neg = true
820 return z
821 }
822
823
824 z.abs = z.abs.and(x.abs, y.abs)
825 z.neg = false
826 return z
827 }
828
829
830 if x.neg {
831 x, y = y, x
832 }
833
834
835 y1 := nat(nil).sub(y.abs, natOne)
836 z.abs = z.abs.andNot(x.abs, y1)
837 z.neg = false
838 return z
839 }
840
841
842 func (z *Int) AndNot(x, y *Int) *Int {
843 if x.neg == y.neg {
844 if x.neg {
845
846 x1 := nat(nil).sub(x.abs, natOne)
847 y1 := nat(nil).sub(y.abs, natOne)
848 z.abs = z.abs.andNot(y1, x1)
849 z.neg = false
850 return z
851 }
852
853
854 z.abs = z.abs.andNot(x.abs, y.abs)
855 z.neg = false
856 return z
857 }
858
859 if x.neg {
860
861 x1 := nat(nil).sub(x.abs, natOne)
862 z.abs = z.abs.add(z.abs.or(x1, y.abs), natOne)
863 z.neg = true
864 return z
865 }
866
867
868 y1 := nat(nil).add(y.abs, natOne)
869 z.abs = z.abs.and(x.abs, y1)
870 z.neg = false
871 return z
872 }
873
874
875 func (z *Int) Or(x, y *Int) *Int {
876 if x.neg == y.neg {
877 if x.neg {
878
879 x1 := nat(nil).sub(x.abs, natOne)
880 y1 := nat(nil).sub(y.abs, natOne)
881 z.abs = z.abs.add(z.abs.and(x1, y1), natOne)
882 z.neg = true
883 return z
884 }
885
886
887 z.abs = z.abs.or(x.abs, y.abs)
888 z.neg = false
889 return z
890 }
891
892
893 if x.neg {
894 x, y = y, x
895 }
896
897
898 y1 := nat(nil).sub(y.abs, natOne)
899 z.abs = z.abs.add(z.abs.andNot(y1, x.abs), natOne)
900 z.neg = true
901 return z
902 }
903
904
905 func (z *Int) Xor(x, y *Int) *Int {
906 if x.neg == y.neg {
907 if x.neg {
908
909 x1 := nat(nil).sub(x.abs, natOne)
910 y1 := nat(nil).sub(y.abs, natOne)
911 z.abs = z.abs.xor(x1, y1)
912 z.neg = false
913 return z
914 }
915
916
917 z.abs = z.abs.xor(x.abs, y.abs)
918 z.neg = false
919 return z
920 }
921
922
923 if x.neg {
924 x, y = y, x
925 }
926
927
928 y1 := nat(nil).sub(y.abs, natOne)
929 z.abs = z.abs.add(z.abs.xor(x.abs, y1), natOne)
930 z.neg = true
931 return z
932 }
933
934
935 func (z *Int) Not(x *Int) *Int {
936 if x.neg {
937
938 z.abs = z.abs.sub(x.abs, natOne)
939 z.neg = false
940 return z
941 }
942
943
944 z.abs = z.abs.add(x.abs, natOne)
945 z.neg = true
946 return z
947 }
948
949
950 const intGobVersion byte = 1
951
952
953 func (x *Int) GobEncode() ([]byte, error) {
954 buf := make([]byte, 1+len(x.abs)*_S)
955 i := x.abs.bytes(buf) - 1
956 b := intGobVersion << 1
957 if x.neg {
958 b |= 1
959 }
960 buf[i] = b
961 return buf[i:], nil
962 }
963
964
965 func (z *Int) GobDecode(buf []byte) error {
966 if len(buf) == 0 {
967 return errors.New("Int.GobDecode: no data")
968 }
969 b := buf[0]
970 if b>>1 != intGobVersion {
971 return errors.New(fmt.Sprintf("Int.GobDecode: encoding version %d not supported", b>>1))
972 }
973 z.neg = b&1 != 0
974 z.abs = z.abs.setBytes(buf[1:])
975 return nil
976 }
977
978
979 func (x *Int) MarshalJSON() ([]byte, error) {
980
981 return []byte(x.String()), nil
982 }
983
984
985 func (z *Int) UnmarshalJSON(x []byte) error {
986
987 _, ok := z.SetString(string(x), 0)
988 if !ok {
989 return fmt.Errorf("math/big: cannot unmarshal %s into a *big.Int", x)
990 }
991 return nil
992 }
View as plain text