@@ -294,8 +294,8 @@ private int compareShifted(MutableBigInteger b, int ints) {
294
294
// comparison.
295
295
int [] bval = b .value ;
296
296
for (int i = offset , j = b .offset ; i < alen + offset ; i ++, j ++) {
297
- int b1 = value [i ] + 0x80000000 ;
298
- int b2 = bval [j ] + 0x80000000 ;
297
+ int b1 = ( value [i ] + 0x80000000 )| 0 ;
298
+ int b2 = ( bval [j ] + 0x80000000 )| 0 ;
299
299
if (b1 < b2 )
300
300
return -1 ;
301
301
if (b1 > b2 )
@@ -889,9 +889,11 @@ void addDisjoint(MutableBigInteger addend, int n) {
889
889
for (int i =rstart +1 -y +len ; i < rstart +1 ; i ++)
890
890
result [i ] = 0 ;
891
891
892
- value = result ;
893
892
intLen = resultLen ;
894
893
offset = result .length - resultLen ;
894
+
895
+ value = result ;
896
+
895
897
}
896
898
897
899
/**
@@ -939,18 +941,17 @@ int subtract(MutableBigInteger b) {
939
941
// Subtract common parts of both numbers
940
942
while (y > 0 ) {
941
943
x --; y --;
942
-
943
- diff = (a .value [x +a .offset ] & LONG_MASK ) -
944
- (b .value [y +b .offset ] & LONG_MASK ) - (( int )-(diff >>32 ) );
944
+ // 2024.02.22 BH long-long-int fails, now (long-long)-int
945
+ diff = (( a .value [x +a .offset ] & LONG_MASK )
946
+ - (b .value [y +b .offset ] & LONG_MASK )) - (int )-(diff >>32 );
945
947
result [rstart --] = (int )diff ;
946
948
}
947
- // Subtract remainder of longer number
949
+ // Subtract remainder of longer number
948
950
while (x > 0 ) {
949
951
x --;
950
- diff = (a .value [x +a .offset ] & LONG_MASK ) - (( int )-(diff >>32 ) );
952
+ diff = (a .value [x +a .offset ] & LONG_MASK ) - (int )-(diff >>32 );
951
953
result [rstart --] = (int )diff ;
952
954
}
953
-
954
955
value = result ;
955
956
intLen = resultLen ;
956
957
offset = value .length - resultLen ;
@@ -1261,6 +1262,8 @@ MutableBigInteger divideAndRemainderBurnikelZiegler(MutableBigInteger b, Mutable
1261
1262
int n = j * m ; // step 2b: block length in 32-bit units
1262
1263
long n32 = 32L * n ; // block length in bits
1263
1264
int sigma = (int ) Math .max (0 , n32 - b .bitLength ()); // step 3: sigma = max{T | (2^T)*B < beta^n}
1265
+
1266
+
1264
1267
MutableBigInteger bShifted = new MutableBigInteger (b );
1265
1268
bShifted .safeLeftShift (sigma ); // step 4a: shift b so its length is a multiple of n
1266
1269
MutableBigInteger aShifted = new MutableBigInteger (this );
@@ -1278,7 +1281,6 @@ MutableBigInteger divideAndRemainderBurnikelZiegler(MutableBigInteger b, Mutable
1278
1281
// step 7: z[t-2] = [a[t-1], a[t-2]]
1279
1282
MutableBigInteger z = aShifted .getBlock (t -2 , t , n ); // the second to most significant block
1280
1283
z .addDisjoint (a1 , n ); // z[t-2]
1281
-
1282
1284
// do schoolbook division on blocks, dividing 2-block numbers by 1-block numbers
1283
1285
MutableBigInteger qi = new MutableBigInteger ();
1284
1286
MutableBigInteger ri ;
@@ -1356,7 +1358,6 @@ private MutableBigInteger divide3n2n(MutableBigInteger b, MutableBigInteger quot
1356
1358
MutableBigInteger b1 = new MutableBigInteger (b );
1357
1359
b1 .safeRightShift (n * 32 );
1358
1360
BigInteger b2 = b .getLower (n );
1359
-
1360
1361
MutableBigInteger r ;
1361
1362
MutableBigInteger d ;
1362
1363
if (compareShifted (b , n ) < 0 ) {
@@ -1381,6 +1382,7 @@ private MutableBigInteger divide3n2n(MutableBigInteger b, MutableBigInteger quot
1381
1382
1382
1383
// step 5: r = r*beta^n + a3 - d (paper says a4)
1383
1384
// However, don't subtract d until after the while loop so r doesn't become negative
1385
+
1384
1386
r .leftShift (32 * n );
1385
1387
r .addLower (this , n );
1386
1388
@@ -1390,7 +1392,6 @@ private MutableBigInteger divide3n2n(MutableBigInteger b, MutableBigInteger quot
1390
1392
quotient .subtract (MutableBigInteger .ONE );
1391
1393
}
1392
1394
r .subtract (d );
1393
-
1394
1395
return r ;
1395
1396
}
1396
1397
@@ -1548,13 +1549,13 @@ private MutableBigInteger divideMagnitude(MutableBigInteger div,
1548
1549
int qrem = 0 ;
1549
1550
boolean skipCorrection = false ;
1550
1551
int nh = rem .value [j +rem .offset ];
1551
- int nh2 = nh + 0x80000000 ;
1552
+ int nh2 = ( nh + 0x80000000 )| 0 ;
1552
1553
int nm = rem .value [j +1 +rem .offset ];
1553
1554
1554
1555
if (nh == dh ) {
1555
1556
qhat = ~0 ;
1556
1557
qrem = nh + nm ;
1557
- skipCorrection = qrem + 0x80000000 < nh2 ;
1558
+ skipCorrection = (( qrem + 0x80000000 )| 0 ) < nh2 ;
1558
1559
} else {
1559
1560
long nChunk = (((long )nh ) << 32 ) | (nm & LONG_MASK );
1560
1561
if (nChunk >= 0 ) {
@@ -1592,7 +1593,7 @@ private MutableBigInteger divideMagnitude(MutableBigInteger div,
1592
1593
int borrow = mulsub (rem .value , divisor , qhat , dlen , j +rem .offset );
1593
1594
1594
1595
// D5 Test remainder
1595
- if (borrow + 0x80000000 > nh2 ) {
1596
+ if ((( borrow + 0x80000000 )| 0 ) > nh2 ) {
1596
1597
// D6 Add back
1597
1598
divadd (divisor , rem .value , j +1 +rem .offset );
1598
1599
qhat --;
@@ -1607,13 +1608,13 @@ private MutableBigInteger divideMagnitude(MutableBigInteger div,
1607
1608
int qrem = 0 ;
1608
1609
boolean skipCorrection = false ;
1609
1610
int nh = rem .value [limit - 1 + rem .offset ];
1610
- int nh2 = nh + 0x80000000 ;
1611
+ int nh2 = ( nh + 0x80000000 )| 0 ;
1611
1612
int nm = rem .value [limit + rem .offset ];
1612
1613
1613
1614
if (nh == dh ) {
1614
1615
qhat = ~0 ;
1615
1616
qrem = nh + nm ;
1616
- skipCorrection = qrem + 0x80000000 < nh2 ;
1617
+ skipCorrection = (( qrem + 0x80000000 )| 0 ) < nh2 ;
1617
1618
} else {
1618
1619
long nChunk = (((long ) nh ) << 32 ) | (nm & LONG_MASK );
1619
1620
if (nChunk >= 0 ) {
@@ -1653,7 +1654,7 @@ private MutableBigInteger divideMagnitude(MutableBigInteger div,
1653
1654
borrow = mulsubBorrow (rem .value , divisor , qhat , dlen , limit - 1 + rem .offset );
1654
1655
1655
1656
// D5 Test remainder
1656
- if (borrow + 0x80000000 > nh2 ) {
1657
+ if ((( borrow + 0x80000000 )| 0 ) > nh2 ) {
1657
1658
// D6 Add back
1658
1659
if (needRemainder )
1659
1660
divadd (divisor , rem .value , limit - 1 + 1 + rem .offset );
@@ -1723,13 +1724,13 @@ private MutableBigInteger divideLongMagnitude(long ldivisor, MutableBigInteger q
1723
1724
int qrem = 0 ;
1724
1725
boolean skipCorrection = false ;
1725
1726
int nh = rem .value [j + rem .offset ];
1726
- int nh2 = nh + 0x80000000 ;
1727
+ int nh2 = ( nh + 0x80000000 )| 0 ;
1727
1728
int nm = rem .value [j + 1 + rem .offset ];
1728
1729
1729
1730
if (nh == dh ) {
1730
1731
qhat = ~0 ;
1731
1732
qrem = nh + nm ;
1732
- skipCorrection = qrem + 0x80000000 < nh2 ;
1733
+ skipCorrection = (( qrem + 0x80000000 )| 0 ) < nh2 ;
1733
1734
} else {
1734
1735
long nChunk = (((long ) nh ) << 32 ) | (nm & LONG_MASK );
1735
1736
if (nChunk >= 0 ) {
@@ -1767,7 +1768,7 @@ private MutableBigInteger divideLongMagnitude(long ldivisor, MutableBigInteger q
1767
1768
int borrow = mulsubLong (rem .value , dh , dl , qhat , j + rem .offset );
1768
1769
1769
1770
// D5 Test remainder
1770
- if (borrow + 0x80000000 > nh2 ) {
1771
+ if ((( borrow + 0x80000000 )| 0 ) > nh2 ) {
1771
1772
// D6 Add back
1772
1773
divaddLong (dh ,dl , rem .value , j + 1 + rem .offset );
1773
1774
qhat --;
@@ -1963,7 +1964,7 @@ static int binaryGcd(int a, int b) {
1963
1964
int t = (aZeros < bZeros ? aZeros : bZeros );
1964
1965
1965
1966
while (a != b ) {
1966
- if ((a +0x80000000 ) > (b +0x80000000 )) { // a > b as unsigned
1967
+ if ((( a +0x80000000 )| 0 ) > (( b +0x80000000 )| 0 )) { // a > b as unsigned
1967
1968
a -= b ;
1968
1969
a >>>= Integer .numberOfTrailingZeros (a );
1969
1970
} else {
0 commit comments