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