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