Created originally on Bitbucket by _stian (Stian Andreassen)
- Introduce missing int_* ops for longobjects.
- Introduce uint128_t usage (speeds up division especially)
- Remove dead code (_k_lopsided_mul)
- Reduce widedigit usage,
-
Negative rshift don't construct two copies due to invert(), it is done directly when needed(corner case bugged, so backed out) - Various other tweaks.
EDIT EDIT: Updated benchmarks (again):
# default
pidigits:
5.58517289162
5.57667803764
5.56680297852
5.59365510941
5.56935095787
rshift / negative rshift / negative division
Rshift: 3.54013109207
negative Rshift: 5.58266806602
negative division: 5.00440096855
mul / div / sub / divmod / combo (mul, div, add, sub both power of two and not):
Mul: 1.20939302444
Div: 2.71100902557
Sub: 0.872174024582
Divmod: 1.95274686813
Combo: 6.11089587212
Mul: 1.00893998146
Div: 2.70459008217
Sub: 0.880041837692
Divmod: 1.97017598152
Combo: 6.11151504517
targetbigintbenchmark (opt=2):
mod by 2: 0.008424
mod by 10000: 2.983878
mod by 1024 (power of two): 0.004757
Div huge number by 2**128: 1.334409
rshift: 1.383267
lshift: 0.947445
Floordiv by 2: 1.414989
Floordiv by 3 (not power of two): 2.373175
2**500000: 0.025707
(2**N)**5000000 (power of two): 0.034995
10000 ** BIGNUM % 100 0.666761
i = i * i: 4.330285
n**10000 (not power of two): 4.854310
Power of two ** power of two: 0.008637
v = v * power of two 3.839690
v = v * v 4.869498
v = v + v 1.745856
Sum: 30.826083
# math-improvements
pidigits:
5.07686400414
5.08084702492
5.09229803085
5.07678604126
5.07486820221
rshift / negative rshift / negative division
Rshift: 3.28986907005
negative Rshift: 3.55797290802
negative division: 3.92593812943
mul / div / sub / divmod / combo (mul, div, add, sub both power of two and not)
Mul: 0.982383012772
Div: 2.16784906387
Sub: 0.686630964279
Divmod: 1.62708497047
Combo: 4.71258592606
Mul: 0.986311912537
Div: 2.1686630249
Sub: 0.669193983078
Divmod: 1.64836978912
Combo: 4.72971796989
targetbigintbenchmark (opt=2):
mod by 2: 0.003024
mod by 10000: 2.875079
mod by 1024 (power of two): 0.004637
Div huge number by 2**128: 1.256985
rshift: 1.283785
lshift: 0.669360
Floordiv by 2: 1.325123
Floordiv by 3 (not power of two): 1.917384
2**500000: 0.025485
(2**N)**5000000 (power of two): 0.034635
10000 ** BIGNUM % 100 0.663866
i = i * i: 3.234646
n**10000 (not power of two): 4.706276
Power of two ** power of two: 0.008254
v = v * power of two 2.887551
v = v * v 4.727782
v = v + v 1.738297
Sum: 27.362169
targetbigintbenchmark (bmi2):
mod by 2: 0.003470
mod by 10000: 2.886580
mod by 1024 (power of two): 0.004507
Div huge number by 2**128: 1.278973
rshift: 1.293788
lshift: 0.664146
Floordiv by 2: 1.320495
Floordiv by 3 (not power of two): 1.916437
2**500000: 0.025505
(2**N)**5000000 (power of two): 0.036232
10000 ** BIGNUM % 100 0.652199
i = i * i: 2.875679
n**10000 (not power of two): 4.749082
Power of two ** power of two: 0.008260
v = v * power of two 2.569354
v = v * v 4.731395
v = v + v 1.728124
Sum: 26.744226