@@ -181,16 +181,20 @@ func (z *Int) Sub(x, y *Int) *Int {
181
181
182
182
// Mul sets z to the product x*y and returns z.
183
183
func (z * Int ) Mul (x , y * Int ) * Int {
184
+ return z .mul (nil , x , y )
185
+ }
186
+
187
+ func (z * Int ) mul (stk * stack , x , y * Int ) * Int {
184
188
// x * y == x * y
185
189
// x * (-y) == -(x * y)
186
190
// (-x) * y == -(x * y)
187
191
// (-x) * (-y) == x * y
188
192
if x == y {
189
- z .abs = z .abs .sqr (x .abs )
193
+ z .abs = z .abs .sqr (stk , x .abs )
190
194
z .neg = false
191
195
return z
192
196
}
193
- z .abs = z .abs .mul (x .abs , y .abs )
197
+ z .abs = z .abs .mul (stk , x .abs , y .abs )
194
198
z .neg = len (z .abs ) > 0 && x .neg != y .neg // 0 has no sign
195
199
return z
196
200
}
@@ -213,7 +217,7 @@ func (z *Int) MulRange(a, b int64) *Int {
213
217
a , b = - b , - a
214
218
}
215
219
216
- z .abs = z .abs .mulRange (uint64 (a ), uint64 (b ))
220
+ z .abs = z .abs .mulRange (nil , uint64 (a ), uint64 (b ))
217
221
z .neg = neg
218
222
return z
219
223
}
@@ -264,7 +268,7 @@ func (z *Int) Binomial(n, k int64) *Int {
264
268
// If y == 0, a division-by-zero run-time panic occurs.
265
269
// Quo implements truncated division (like Go); see [Int.QuoRem] for more details.
266
270
func (z * Int ) Quo (x , y * Int ) * Int {
267
- z .abs , _ = z .abs .div (nil , x .abs , y .abs )
271
+ z .abs , _ = z .abs .div (nil , nil , x .abs , y .abs )
268
272
z .neg = len (z .abs ) > 0 && x .neg != y .neg // 0 has no sign
269
273
return z
270
274
}
@@ -273,7 +277,7 @@ func (z *Int) Quo(x, y *Int) *Int {
273
277
// If y == 0, a division-by-zero run-time panic occurs.
274
278
// Rem implements truncated modulus (like Go); see [Int.QuoRem] for more details.
275
279
func (z * Int ) Rem (x , y * Int ) * Int {
276
- _ , z .abs = nat (nil ).div (z .abs , x .abs , y .abs )
280
+ _ , z .abs = nat (nil ).div (nil , z .abs , x .abs , y .abs )
277
281
z .neg = len (z .abs ) > 0 && x .neg // 0 has no sign
278
282
return z
279
283
}
@@ -290,7 +294,7 @@ func (z *Int) Rem(x, y *Int) *Int {
290
294
// (See Daan Leijen, “Division and Modulus for Computer Scientists”.)
291
295
// See [Int.DivMod] for Euclidean division and modulus (unlike Go).
292
296
func (z * Int ) QuoRem (x , y , r * Int ) (* Int , * Int ) {
293
- z .abs , r .abs = z .abs .div (r .abs , x .abs , y .abs )
297
+ z .abs , r .abs = z .abs .div (nil , r .abs , x .abs , y .abs )
294
298
z .neg , r .neg = len (z .abs ) > 0 && x .neg != y .neg , len (r .abs ) > 0 && x .neg // 0 has no sign
295
299
return z , r
296
300
}
@@ -589,7 +593,7 @@ func (z *Int) exp(x, y, m *Int, slow bool) *Int {
589
593
mWords = m .abs // m.abs may be nil for m == 0
590
594
}
591
595
592
- z .abs = z .abs .expNN (xWords , yWords , mWords , slow )
596
+ z .abs = z .abs .expNN (nil , xWords , yWords , mWords , slow )
593
597
z .neg = len (z .abs ) > 0 && x .neg && len (yWords ) > 0 && yWords [0 ]& 1 == 1 // 0 has no sign
594
598
if z .neg && len (mWords ) > 0 {
595
599
// make modulus result positive
@@ -1298,6 +1302,6 @@ func (z *Int) Sqrt(x *Int) *Int {
1298
1302
panic ("square root of negative number" )
1299
1303
}
1300
1304
z .neg = false
1301
- z .abs = z .abs .sqrt (x .abs )
1305
+ z .abs = z .abs .sqrt (nil , x .abs )
1302
1306
return z
1303
1307
}
0 commit comments