Source file
src/math/big/int.go
1
2
3
4
5
6
7 package big
8
9 import (
10 "fmt"
11 "io"
12 "math/rand"
13 "strings"
14 )
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 type Int struct {
34 neg bool
35 abs nat
36 }
37
38 var intOne = &Int{false, natOne}
39
40
41
42
43
44 func (x *Int) Sign() int {
45
46
47
48 if len(x.abs) == 0 {
49 return 0
50 }
51 if x.neg {
52 return -1
53 }
54 return 1
55 }
56
57
58 func (z *Int) SetInt64(x int64) *Int {
59 neg := false
60 if x < 0 {
61 neg = true
62 x = -x
63 }
64 z.abs = z.abs.setUint64(uint64(x))
65 z.neg = neg
66 return z
67 }
68
69
70 func (z *Int) SetUint64(x uint64) *Int {
71 z.abs = z.abs.setUint64(x)
72 z.neg = false
73 return z
74 }
75
76
77 func NewInt(x int64) *Int {
78
79
80 u := uint64(x)
81 if x < 0 {
82 u = -u
83 }
84 var abs []Word
85 if x == 0 {
86 } else if _W == 32 && u>>32 != 0 {
87 abs = []Word{Word(u), Word(u >> 32)}
88 } else {
89 abs = []Word{Word(u)}
90 }
91 return &Int{neg: x < 0, abs: abs}
92 }
93
94
95 func (z *Int) Set(x *Int) *Int {
96 if z != x {
97 z.abs = z.abs.set(x.abs)
98 z.neg = x.neg
99 }
100 return z
101 }
102
103
104
105
106
107
108 func (x *Int) Bits() []Word {
109
110
111
112 return x.abs
113 }
114
115
116
117
118
119
120 func (z *Int) SetBits(abs []Word) *Int {
121 z.abs = nat(abs).norm()
122 z.neg = false
123 return z
124 }
125
126
127 func (z *Int) Abs(x *Int) *Int {
128 z.Set(x)
129 z.neg = false
130 return z
131 }
132
133
134 func (z *Int) Neg(x *Int) *Int {
135 z.Set(x)
136 z.neg = len(z.abs) > 0 && !z.neg
137 return z
138 }
139
140
141 func (z *Int) Add(x, y *Int) *Int {
142 neg := x.neg
143 if x.neg == y.neg {
144
145
146 z.abs = z.abs.add(x.abs, y.abs)
147 } else {
148
149
150 if x.abs.cmp(y.abs) >= 0 {
151 z.abs = z.abs.sub(x.abs, y.abs)
152 } else {
153 neg = !neg
154 z.abs = z.abs.sub(y.abs, x.abs)
155 }
156 }
157 z.neg = len(z.abs) > 0 && neg
158 return z
159 }
160
161
162 func (z *Int) Sub(x, y *Int) *Int {
163 neg := x.neg
164 if x.neg != y.neg {
165
166
167 z.abs = z.abs.add(x.abs, y.abs)
168 } else {
169
170
171 if x.abs.cmp(y.abs) >= 0 {
172 z.abs = z.abs.sub(x.abs, y.abs)
173 } else {
174 neg = !neg
175 z.abs = z.abs.sub(y.abs, x.abs)
176 }
177 }
178 z.neg = len(z.abs) > 0 && neg
179 return z
180 }
181
182
183 func (z *Int) Mul(x, y *Int) *Int {
184 z.mul(nil, x, y)
185 return z
186 }
187
188
189
190
191 func (z *Int) mul(stk *stack, x, y *Int) {
192
193
194
195
196 if x == y {
197 z.abs = z.abs.sqr(stk, x.abs)
198 z.neg = false
199 return
200 }
201 z.abs = z.abs.mul(stk, x.abs, y.abs)
202 z.neg = len(z.abs) > 0 && x.neg != y.neg
203 }
204
205
206
207
208 func (z *Int) MulRange(a, b int64) *Int {
209 switch {
210 case a > b:
211 return z.SetInt64(1)
212 case a <= 0 && b >= 0:
213 return z.SetInt64(0)
214 }
215
216
217 neg := false
218 if a < 0 {
219 neg = (b-a)&1 == 0
220 a, b = -b, -a
221 }
222
223 z.abs = z.abs.mulRange(nil, uint64(a), uint64(b))
224 z.neg = neg
225 return z
226 }
227
228
229 func (z *Int) Binomial(n, k int64) *Int {
230 if k > n || k < 0 {
231 return z.SetInt64(0)
232 }
233
234 if k > n-k {
235 k = n - k
236 }
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258 var N, K, i, t Int
259 N.SetInt64(n)
260 K.SetInt64(k)
261 z.Set(intOne)
262 for i.Cmp(&K) < 0 {
263 z.Mul(z, t.Sub(&N, &i))
264 i.Add(&i, intOne)
265 z.Quo(z, &i)
266 }
267 return z
268 }
269
270
271
272
273 func (z *Int) Quo(x, y *Int) *Int {
274 z.abs, _ = z.abs.div(nil, nil, x.abs, y.abs)
275 z.neg = len(z.abs) > 0 && x.neg != y.neg
276 return z
277 }
278
279
280
281
282 func (z *Int) Rem(x, y *Int) *Int {
283 _, z.abs = nat(nil).div(nil, z.abs, x.abs, y.abs)
284 z.neg = len(z.abs) > 0 && x.neg
285 return z
286 }
287
288
289
290
291
292
293
294
295
296
297
298
299 func (z *Int) QuoRem(x, y, r *Int) (*Int, *Int) {
300 z.abs, r.abs = z.abs.div(nil, r.abs, x.abs, y.abs)
301 z.neg, r.neg = len(z.abs) > 0 && x.neg != y.neg, len(r.abs) > 0 && x.neg
302 return z, r
303 }
304
305
306
307
308 func (z *Int) Div(x, y *Int) *Int {
309 y_neg := y.neg
310 var r Int
311 z.QuoRem(x, y, &r)
312 if r.neg {
313 if y_neg {
314 z.Add(z, intOne)
315 } else {
316 z.Sub(z, intOne)
317 }
318 }
319 return z
320 }
321
322
323
324
325 func (z *Int) Mod(x, y *Int) *Int {
326 y0 := y
327 if z == y || alias(z.abs, y.abs) {
328 y0 = new(Int).Set(y)
329 }
330 var q Int
331 q.QuoRem(x, y, z)
332 if z.neg {
333 if y0.neg {
334 z.Sub(z, y0)
335 } else {
336 z.Add(z, y0)
337 }
338 }
339 return z
340 }
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356 func (z *Int) DivMod(x, y, m *Int) (*Int, *Int) {
357 y0 := y
358 if z == y || alias(z.abs, y.abs) {
359 y0 = new(Int).Set(y)
360 }
361 z.QuoRem(x, y, m)
362 if m.neg {
363 if y0.neg {
364 z.Add(z, intOne)
365 m.Sub(m, y0)
366 } else {
367 z.Sub(z, intOne)
368 m.Add(m, y0)
369 }
370 }
371 return z, m
372 }
373
374
375
376 const (
377 Trunc = ToZero
378 Floor = ToNegativeInf
379 Round = ToNearestEven
380 Ceil = ToPositiveInf
381 )
382
383
384
385
386
387
388
389
390
391
392
393 func (z *Int) Divide(x, y, r *Int, mode RoundingMode) (*Int, *Int) {
394
395 var z_abs nat
396 if z != nil {
397 z_abs = z.abs
398 }
399 var r_neg bool
400 var r_abs nat
401 if r != nil {
402 r_abs = r.abs
403 }
404 y_abs := y.abs
405 if z == y || alias(z_abs, y.abs) {
406 y_abs = nat(nil).set(y.abs)
407 }
408 neg := x.neg != y.neg
409 z_abs, r_abs = z_abs.div(nil, r_abs, x.abs, y.abs)
410 if len(r_abs) > 0 {
411 switch mode {
412 case Trunc:
413 r_neg = x.neg
414 case Floor:
415 r_neg = y.neg
416 if neg {
417 z_abs = z_abs.add(z_abs, natOne)
418 r_abs = r_abs.sub(y_abs, r_abs)
419 }
420 case Ceil:
421 r_neg = !y.neg
422 if !neg {
423 z_abs = z_abs.add(z_abs, natOne)
424 r_abs = r_abs.sub(y_abs, r_abs)
425 }
426 case Round:
427 switch nat(nil).mul(nil, r_abs, natTwo).cmp(y_abs) {
428 case -1:
429 r_neg = x.neg
430 case 0:
431 even := len(z_abs) == 0 || z_abs[0]&1 == 0
432 if even {
433 r_neg = x.neg
434 break
435 }
436 fallthrough
437 case 1:
438 r_neg = !x.neg
439 z_abs = z_abs.add(z_abs, natOne)
440 r_abs = r_abs.sub(y_abs, r_abs)
441 }
442 default:
443 panic("unsupported rounding mode")
444 }
445 }
446 if z != nil {
447 z.abs = z_abs
448 z.neg = neg && len(z_abs) > 0
449 }
450 if r != nil {
451 r.abs = r_abs
452 r.neg = r_neg
453 }
454 return z, r
455 }
456
457
458
459
460
461 func (x *Int) Cmp(y *Int) (r int) {
462
463
464
465
466 switch {
467 case x == y:
468
469 case x.neg == y.neg:
470 r = x.abs.cmp(y.abs)
471 if x.neg {
472 r = -r
473 }
474 case x.neg:
475 r = -1
476 default:
477 r = 1
478 }
479 return
480 }
481
482
483
484
485
486 func (x *Int) CmpAbs(y *Int) int {
487 return x.abs.cmp(y.abs)
488 }
489
490
491 func low32(x nat) uint32 {
492 if len(x) == 0 {
493 return 0
494 }
495 return uint32(x[0])
496 }
497
498
499 func low64(x nat) uint64 {
500 if len(x) == 0 {
501 return 0
502 }
503 v := uint64(x[0])
504 if _W == 32 && len(x) > 1 {
505 return uint64(x[1])<<32 | v
506 }
507 return v
508 }
509
510
511
512 func (x *Int) Int64() int64 {
513 v := int64(low64(x.abs))
514 if x.neg {
515 v = -v
516 }
517 return v
518 }
519
520
521
522 func (x *Int) Uint64() uint64 {
523 return low64(x.abs)
524 }
525
526
527 func (x *Int) IsInt64() bool {
528 if len(x.abs) <= 64/_W {
529 w := int64(low64(x.abs))
530 return w >= 0 || x.neg && w == -w
531 }
532 return false
533 }
534
535
536 func (x *Int) IsUint64() bool {
537 return !x.neg && len(x.abs) <= 64/_W
538 }
539
540
541
542 func (x *Int) Float64() (float64, Accuracy) {
543 n := x.abs.bitLen()
544 if n == 0 {
545 return 0.0, Exact
546 }
547
548
549 if n <= 53 || n < 64 && n-int(x.abs.trailingZeroBits()) <= 53 {
550 f := float64(low64(x.abs))
551 if x.neg {
552 f = -f
553 }
554 return f, Exact
555 }
556
557 return new(Float).SetInt(x).Float64()
558 }
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582 func (z *Int) SetString(s string, base int) (*Int, bool) {
583 return z.setFromScanner(strings.NewReader(s), base)
584 }
585
586
587
588 func (z *Int) setFromScanner(r io.ByteScanner, base int) (*Int, bool) {
589 if _, _, err := z.scan(r, base); err != nil {
590 return nil, false
591 }
592
593 if _, err := r.ReadByte(); err != io.EOF {
594 return nil, false
595 }
596 return z, true
597 }
598
599
600
601 func (z *Int) SetBytes(buf []byte) *Int {
602 z.abs = z.abs.setBytes(buf)
603 z.neg = false
604 return z
605 }
606
607
608
609
610 func (x *Int) Bytes() []byte {
611
612
613
614 buf := make([]byte, len(x.abs)*_S)
615 return buf[x.abs.bytes(buf):]
616 }
617
618
619
620
621
622 func (x *Int) FillBytes(buf []byte) []byte {
623
624 clear(buf)
625 x.abs.bytes(buf)
626 return buf
627 }
628
629
630
631 func (x *Int) BitLen() int {
632
633
634
635 return x.abs.bitLen()
636 }
637
638
639
640 func (x *Int) TrailingZeroBits() uint {
641 return x.abs.trailingZeroBits()
642 }
643
644
645
646
647
648
649
650 func (z *Int) Exp(x, y, m *Int) *Int {
651 return z.exp(x, y, m, false)
652 }
653
654 func (z *Int) expSlow(x, y, m *Int) *Int {
655 return z.exp(x, y, m, true)
656 }
657
658 func (z *Int) exp(x, y, m *Int, slow bool) *Int {
659
660 xWords := x.abs
661 if y.neg {
662 if m == nil || len(m.abs) == 0 {
663 return z.SetInt64(1)
664 }
665
666 inverse := new(Int).ModInverse(x, m)
667 if inverse == nil {
668 return nil
669 }
670 xWords = inverse.abs
671 }
672 yWords := y.abs
673
674 var mWords nat
675 if m != nil {
676 if z == m || alias(z.abs, m.abs) {
677 m = new(Int).Set(m)
678 }
679 mWords = m.abs
680 }
681
682 z.abs = z.abs.expNN(nil, xWords, yWords, mWords, slow)
683 z.neg = len(z.abs) > 0 && x.neg && len(yWords) > 0 && yWords[0]&1 == 1
684 if z.neg && len(mWords) > 0 {
685
686 z.abs = z.abs.sub(mWords, z.abs)
687 z.neg = false
688 }
689
690 return z
691 }
692
693
694
695
696
697
698
699
700
701
702
703
704 func (z *Int) GCD(x, y, a, b *Int) *Int {
705 if len(a.abs) == 0 || len(b.abs) == 0 {
706 lenA, lenB, negA, negB := len(a.abs), len(b.abs), a.neg, b.neg
707 if lenA == 0 {
708 z.Set(b)
709 } else {
710 z.Set(a)
711 }
712 z.neg = false
713 if x != nil {
714 if lenA == 0 {
715 x.SetUint64(0)
716 } else {
717 x.SetUint64(1)
718 x.neg = negA
719 }
720 }
721 if y != nil {
722 if lenB == 0 {
723 y.SetUint64(0)
724 } else {
725 y.SetUint64(1)
726 y.neg = negB
727 }
728 }
729 return z
730 }
731
732 return z.lehmerGCD(x, y, a, b)
733 }
734
735
736
737
738
739
740
741
742
743
744
745
746
747 func lehmerSimulate(A, B *Int) (u0, u1, v0, v1 Word, even bool) {
748
749 var a1, a2, u2, v2 Word
750
751 m := len(B.abs)
752 n := len(A.abs)
753
754
755 h := nlz(A.abs[n-1])
756 a1 = A.abs[n-1]<<h | A.abs[n-2]>>(_W-h)
757
758 switch {
759 case n == m:
760 a2 = B.abs[n-1]<<h | B.abs[n-2]>>(_W-h)
761 case n == m+1:
762 a2 = B.abs[n-2] >> (_W - h)
763 default:
764 a2 = 0
765 }
766
767
768
769
770
771
772 even = false
773
774 u0, u1, u2 = 0, 1, 0
775 v0, v1, v2 = 0, 0, 1
776
777
778
779
780
781 for a2 >= v2 && a1-a2 >= v1+v2 {
782 q, r := a1/a2, a1%a2
783 a1, a2 = a2, r
784 u0, u1, u2 = u1, u2, u1+q*u2
785 v0, v1, v2 = v1, v2, v1+q*v2
786 even = !even
787 }
788 return
789 }
790
791
792
793
794
795
796
797
798
799
800 func lehmerUpdate(A, B, q, r *Int, u0, u1, v0, v1 Word, even bool) {
801 mulW(q, B, even, v0)
802 mulW(r, A, even, u1)
803 mulW(A, A, !even, u0)
804 mulW(B, B, !even, v1)
805 A.Add(A, q)
806 B.Add(B, r)
807 }
808
809
810
811 func mulW(z, x *Int, neg bool, w Word) {
812 z.abs = z.abs.mulAddWW(x.abs, w, 0)
813 z.neg = x.neg != neg
814 }
815
816
817
818
819 func euclidUpdate(A, B, Ua, Ub, q, r *Int, extended bool) (nA, nB, nr, nUa, nUb *Int) {
820 q.QuoRem(A, B, r)
821
822 if extended {
823
824 q.Mul(q, Ub)
825 Ua, Ub = Ub, Ua
826 Ub.Sub(Ub, q)
827 }
828
829 return B, r, A, Ua, Ub
830 }
831
832
833
834
835
836
837
838
839
840
841
842 func (z *Int) lehmerGCD(x, y, a, b *Int) *Int {
843 var A, B, Ua, Ub *Int
844
845 A = new(Int).Abs(a)
846 B = new(Int).Abs(b)
847
848 extended := x != nil || y != nil
849
850 if extended {
851
852 Ua = new(Int).SetInt64(1)
853 Ub = new(Int)
854 }
855
856
857 q := new(Int)
858 r := new(Int)
859
860
861 if A.abs.cmp(B.abs) < 0 {
862 A, B = B, A
863 Ub, Ua = Ua, Ub
864 }
865
866
867 for len(B.abs) > 1 {
868
869 u0, u1, v0, v1, even := lehmerSimulate(A, B)
870
871
872 if v0 != 0 {
873
874
875
876 lehmerUpdate(A, B, q, r, u0, u1, v0, v1, even)
877
878 if extended {
879
880
881 lehmerUpdate(Ua, Ub, q, r, u0, u1, v0, v1, even)
882 }
883
884 } else {
885
886
887 A, B, r, Ua, Ub = euclidUpdate(A, B, Ua, Ub, q, r, extended)
888 }
889 }
890
891 if len(B.abs) > 0 {
892
893 if len(A.abs) > 1 {
894
895 A, B, r, Ua, Ub = euclidUpdate(A, B, Ua, Ub, q, r, extended)
896 }
897 if len(B.abs) > 0 {
898
899 aWord, bWord := A.abs[0], B.abs[0]
900 if extended {
901 var ua, ub, va, vb Word
902 ua, ub = 1, 0
903 va, vb = 0, 1
904 even := true
905 for bWord != 0 {
906 q, r := aWord/bWord, aWord%bWord
907 aWord, bWord = bWord, r
908 ua, ub = ub, ua+q*ub
909 va, vb = vb, va+q*vb
910 even = !even
911 }
912
913 mulW(Ua, Ua, !even, ua)
914 mulW(Ub, Ub, even, va)
915 Ua.Add(Ua, Ub)
916 } else {
917 for bWord != 0 {
918 aWord, bWord = bWord, aWord%bWord
919 }
920 }
921 A.abs[0] = aWord
922 }
923 }
924 negA := a.neg
925 if y != nil {
926
927 if y == b {
928 B.Set(b)
929 } else {
930 B = b
931 }
932
933 y.Mul(a, Ua)
934 if negA {
935 y.neg = !y.neg
936 }
937 y.Sub(A, y)
938 y.Div(y, B)
939 }
940
941 if x != nil {
942 x.Set(Ua)
943 if negA {
944 x.neg = !x.neg
945 }
946 }
947
948 z.Set(A)
949
950 return z
951 }
952
953
954
955
956
957 func (z *Int) Rand(rnd *rand.Rand, n *Int) *Int {
958
959 if n.neg || len(n.abs) == 0 {
960 z.neg = false
961 z.abs = nil
962 return z
963 }
964 z.neg = false
965 z.abs = z.abs.random(rnd, n.abs, n.abs.bitLen())
966 return z
967 }
968
969
970
971
972
973 func (z *Int) ModInverse(g, n *Int) *Int {
974
975 if n.neg {
976 var n2 Int
977 n = n2.Neg(n)
978 }
979 if g.neg {
980 var g2 Int
981 g = g2.Mod(g, n)
982 }
983 var d, x Int
984 d.GCD(&x, nil, g, n)
985
986
987 if d.Cmp(intOne) != 0 {
988 return nil
989 }
990
991
992
993 if x.neg {
994 z.Add(&x, n)
995 } else {
996 z.Set(&x)
997 }
998 return z
999 }
1000
1001 func (z nat) modInverse(g, n nat) nat {
1002
1003 return (&Int{abs: z}).ModInverse(&Int{abs: g}, &Int{abs: n}).abs
1004 }
1005
1006
1007
1008 func Jacobi(x, y *Int) int {
1009 if len(y.abs) == 0 || y.abs[0]&1 == 0 {
1010 panic(fmt.Sprintf("big: invalid 2nd argument to Int.Jacobi: need odd integer but got %s", y.String()))
1011 }
1012
1013
1014
1015
1016
1017 var a, b, c Int
1018 a.Set(x)
1019 b.Set(y)
1020 j := 1
1021
1022 if b.neg {
1023 if a.neg {
1024 j = -1
1025 }
1026 b.neg = false
1027 }
1028
1029 for {
1030 if b.Cmp(intOne) == 0 {
1031 return j
1032 }
1033 if len(a.abs) == 0 {
1034 return 0
1035 }
1036 a.Mod(&a, &b)
1037 if len(a.abs) == 0 {
1038 return 0
1039 }
1040
1041
1042
1043 s := a.abs.trailingZeroBits()
1044 if s&1 != 0 {
1045 bmod8 := b.abs[0] & 7
1046 if bmod8 == 3 || bmod8 == 5 {
1047 j = -j
1048 }
1049 }
1050 c.Rsh(&a, s)
1051
1052
1053 if b.abs[0]&3 == 3 && c.abs[0]&3 == 3 {
1054 j = -j
1055 }
1056 a.Set(&b)
1057 b.Set(&c)
1058 }
1059 }
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069 func (z *Int) modSqrt3Mod4Prime(x, p *Int) *Int {
1070 e := new(Int).Add(p, intOne)
1071 e.Rsh(e, 2)
1072 z.Exp(x, e, p)
1073 return z
1074 }
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084 func (z *Int) modSqrt5Mod8Prime(x, p *Int) *Int {
1085
1086
1087 e := new(Int).Rsh(p, 3)
1088 tx := new(Int).Lsh(x, 1)
1089 alpha := new(Int).Exp(tx, e, p)
1090 beta := new(Int).Mul(alpha, alpha)
1091 beta.Mod(beta, p)
1092 beta.Mul(beta, tx)
1093 beta.Mod(beta, p)
1094 beta.Sub(beta, intOne)
1095 beta.Mul(beta, x)
1096 beta.Mod(beta, p)
1097 beta.Mul(beta, alpha)
1098 z.Mod(beta, p)
1099 return z
1100 }
1101
1102
1103
1104 func (z *Int) modSqrtTonelliShanks(x, p *Int) *Int {
1105
1106 var s Int
1107 s.Sub(p, intOne)
1108 e := s.abs.trailingZeroBits()
1109 s.Rsh(&s, e)
1110
1111
1112 var n Int
1113 n.SetInt64(2)
1114 for Jacobi(&n, p) != -1 {
1115 n.Add(&n, intOne)
1116 }
1117
1118
1119
1120
1121
1122 var y, b, g, t Int
1123 y.Add(&s, intOne)
1124 y.Rsh(&y, 1)
1125 y.Exp(x, &y, p)
1126 b.Exp(x, &s, p)
1127 g.Exp(&n, &s, p)
1128 r := e
1129 for {
1130
1131 var m uint
1132 t.Set(&b)
1133 for t.Cmp(intOne) != 0 {
1134 t.Mul(&t, &t).Mod(&t, p)
1135 m++
1136 }
1137
1138 if m == 0 {
1139 return z.Set(&y)
1140 }
1141
1142 t.SetInt64(0).SetBit(&t, int(r-m-1), 1).Exp(&g, &t, p)
1143
1144 g.Mul(&t, &t).Mod(&g, p)
1145 y.Mul(&y, &t).Mod(&y, p)
1146 b.Mul(&b, &g).Mod(&b, p)
1147 r = m
1148 }
1149 }
1150
1151
1152
1153
1154
1155 func (z *Int) ModSqrt(x, p *Int) *Int {
1156 switch Jacobi(x, p) {
1157 case -1:
1158 return nil
1159 case 0:
1160 return z.SetInt64(0)
1161 case 1:
1162 break
1163 }
1164 if x.neg || x.Cmp(p) >= 0 {
1165 x = new(Int).Mod(x, p)
1166 }
1167
1168 switch {
1169 case p.abs[0]%4 == 3:
1170
1171 return z.modSqrt3Mod4Prime(x, p)
1172 case p.abs[0]%8 == 5:
1173
1174 return z.modSqrt5Mod8Prime(x, p)
1175 default:
1176
1177 return z.modSqrtTonelliShanks(x, p)
1178 }
1179 }
1180
1181
1182 func (z *Int) Lsh(x *Int, n uint) *Int {
1183 z.abs = z.abs.lsh(x.abs, n)
1184 z.neg = x.neg
1185 return z
1186 }
1187
1188
1189 func (z *Int) Rsh(x *Int, n uint) *Int {
1190 if x.neg {
1191
1192 t := z.abs.sub(x.abs, natOne)
1193 t = t.rsh(t, n)
1194 z.abs = t.add(t, natOne)
1195 z.neg = true
1196 return z
1197 }
1198
1199 z.abs = z.abs.rsh(x.abs, n)
1200 z.neg = false
1201 return z
1202 }
1203
1204
1205
1206 func (x *Int) Bit(i int) uint {
1207 if i == 0 {
1208
1209 if len(x.abs) > 0 {
1210 return uint(x.abs[0] & 1)
1211 }
1212 return 0
1213 }
1214 if i < 0 {
1215 panic("negative bit index")
1216 }
1217 if x.neg {
1218 t := nat(nil).sub(x.abs, natOne)
1219 return t.bit(uint(i)) ^ 1
1220 }
1221
1222 return x.abs.bit(uint(i))
1223 }
1224
1225
1226
1227
1228
1229
1230 func (z *Int) SetBit(x *Int, i int, b uint) *Int {
1231 if i < 0 {
1232 panic("negative bit index")
1233 }
1234 if x.neg {
1235 t := z.abs.sub(x.abs, natOne)
1236 t = t.setBit(t, uint(i), b^1)
1237 z.abs = t.add(t, natOne)
1238 z.neg = len(z.abs) > 0
1239 return z
1240 }
1241 z.abs = z.abs.setBit(x.abs, uint(i), b)
1242 z.neg = false
1243 return z
1244 }
1245
1246
1247 func (z *Int) And(x, y *Int) *Int {
1248 if x.neg == y.neg {
1249 if x.neg {
1250
1251 x1 := nat(nil).sub(x.abs, natOne)
1252 y1 := nat(nil).sub(y.abs, natOne)
1253 z.abs = z.abs.add(z.abs.or(x1, y1), natOne)
1254 z.neg = true
1255 return z
1256 }
1257
1258
1259 z.abs = z.abs.and(x.abs, y.abs)
1260 z.neg = false
1261 return z
1262 }
1263
1264
1265 if x.neg {
1266 x, y = y, x
1267 }
1268
1269
1270 y1 := nat(nil).sub(y.abs, natOne)
1271 z.abs = z.abs.andNot(x.abs, y1)
1272 z.neg = false
1273 return z
1274 }
1275
1276
1277 func (z *Int) AndNot(x, y *Int) *Int {
1278 if x.neg == y.neg {
1279 if x.neg {
1280
1281 x1 := nat(nil).sub(x.abs, natOne)
1282 y1 := nat(nil).sub(y.abs, natOne)
1283 z.abs = z.abs.andNot(y1, x1)
1284 z.neg = false
1285 return z
1286 }
1287
1288
1289 z.abs = z.abs.andNot(x.abs, y.abs)
1290 z.neg = false
1291 return z
1292 }
1293
1294 if x.neg {
1295
1296 x1 := nat(nil).sub(x.abs, natOne)
1297 z.abs = z.abs.add(z.abs.or(x1, y.abs), natOne)
1298 z.neg = true
1299 return z
1300 }
1301
1302
1303 y1 := nat(nil).sub(y.abs, natOne)
1304 z.abs = z.abs.and(x.abs, y1)
1305 z.neg = false
1306 return z
1307 }
1308
1309
1310 func (z *Int) Or(x, y *Int) *Int {
1311 if x.neg == y.neg {
1312 if x.neg {
1313
1314 x1 := nat(nil).sub(x.abs, natOne)
1315 y1 := nat(nil).sub(y.abs, natOne)
1316 z.abs = z.abs.add(z.abs.and(x1, y1), natOne)
1317 z.neg = true
1318 return z
1319 }
1320
1321
1322 z.abs = z.abs.or(x.abs, y.abs)
1323 z.neg = false
1324 return z
1325 }
1326
1327
1328 if x.neg {
1329 x, y = y, x
1330 }
1331
1332
1333 y1 := nat(nil).sub(y.abs, natOne)
1334 z.abs = z.abs.add(z.abs.andNot(y1, x.abs), natOne)
1335 z.neg = true
1336 return z
1337 }
1338
1339
1340 func (z *Int) Xor(x, y *Int) *Int {
1341 if x.neg == y.neg {
1342 if x.neg {
1343
1344 x1 := nat(nil).sub(x.abs, natOne)
1345 y1 := nat(nil).sub(y.abs, natOne)
1346 z.abs = z.abs.xor(x1, y1)
1347 z.neg = false
1348 return z
1349 }
1350
1351
1352 z.abs = z.abs.xor(x.abs, y.abs)
1353 z.neg = false
1354 return z
1355 }
1356
1357
1358 if x.neg {
1359 x, y = y, x
1360 }
1361
1362
1363 y1 := nat(nil).sub(y.abs, natOne)
1364 z.abs = z.abs.add(z.abs.xor(x.abs, y1), natOne)
1365 z.neg = true
1366 return z
1367 }
1368
1369
1370 func (z *Int) Not(x *Int) *Int {
1371 if x.neg {
1372
1373 z.abs = z.abs.sub(x.abs, natOne)
1374 z.neg = false
1375 return z
1376 }
1377
1378
1379 z.abs = z.abs.add(x.abs, natOne)
1380 z.neg = true
1381 return z
1382 }
1383
1384
1385
1386 func (z *Int) Sqrt(x *Int) *Int {
1387 if x.neg {
1388 panic("square root of negative number")
1389 }
1390 z.neg = false
1391 z.abs = z.abs.sqrt(nil, x.abs)
1392 return z
1393 }
1394
View as plain text