1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 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 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 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 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974
|
Revision history for Perl module Math::Prime::Util::GMP
0.52 2020-06-22
[ADDED]
- powint(a,b) integer a^b
- mulint(a,b) integer a*b
- addint(a,b) integer a+b
- subint(a,b) integer a-b
- divint(a,b) integer a/b quotient (floor)
- modint(a,b) integer a/b modulo (floor)
- divrem(a,b) integer a/b quo + rem (Euclidian)
- tdivrem(a,b) integer a/b quo + rem (truncated)
- absint(n) integer absolute value
- negint(n) integer negate: returns -n
- is_gaussian_prime(a,b) is a+bi a Gaussian prime
- random_safe_prime(b) random b-bit safe prob prime
- next_twin_prime(n) returns start of twin prime > n
[FIXES]
- Remove a mod in the AKS test that was in code since 2012.
- squfof126 was not portable. GMP 6.2.0 changed to lazy allocation
causing the code to fail. Rewrote function to be more portable.
- is_totient for powers of 2 was returning 0. Thanks Trizen.
- LambertW could fault if given inputs very near the branch point.
[PERFORMANCE]
- Trizen suggested binary splitting LCM. Much faster for big lists.
- Trizen improved speed of lucas sequence for large n and even modulus.
- todigits uses a subquadratic algorithm. Thanks to Trizen for request.
- sieving depth for large sizes wasn't optimal on 32-bit machines.
Thanks to Seth Troisi.
- LambertW is about 2x faster due to a better and faster initial estimate.
0.51 2018-08-27
[ADDED]
- rootreal(x,n[,digits]) nth root of x: x^(1/n)
- addreal(x,y[,digits]) x+y
- subreal(x,y[,digits]) x-y
- mulreal(x,y[,digits]) x*y
- divreal(x,y[,digits]) x/y
- subfactorial(n) !n (derangements)
- factorial_sum(n) !n (sum of factorials)
- multifactorial(x,n) x!, x!!, x!!!, etc.
[FIXES]
- Some memory leaks squashed.
- Trizen reported a factor bug. Fixed with patch to tinyqs.c init code.
[OTHER]
- Work around a bug in NetBSD.
- Standalone ecpp creation fixed.
- Allow Ramanujan polynomials (D = 11 mod 24) for ECPP, reducing sizes.
- Some new code for ei().
- is_primitive_root quite a bit faster.
0.50 2017-11-28
[FIXES]
- real.h mismatched types on machines where unsigned long != UV.
0.49 2017-11-27
[ADDED]
- Euler([digits]) Euler's constant with this many digits
- li(x[,digits]) Logarithmic Integral of x (x floating point)
- ei(x[,digits]) Exponential Integral of x (x floating point)
- logreal(x[,digits]) Natural logarithm of x
- expreal(x[,digits]) e^x
- powreal(x,n[,digits]) x^n
- agmreal(a,b[,digits]) AGM(a,b) - arithmetic-geometric mean
- prime_count_lower(n) lower bounds for prime count
- prime_count_upper(n) upper bounds for prime count
[FIXES]
- When real functions rounded 0.999... to 1.0 and were given too few
digits, they could return .0 instead of 1.0.
[OTHER]
- moebius handles negative inputs
- Added Jason P's cofactorize-tinyqs, which handles up to 126 bit.
This gives us faster and more consistent timing when factoring
20 to 38 digit inputs.
- Rewrite internal log and exp functions. Among other things, this
speeds up LambertW and non-integer Zeta by 10x.
- Use Ramanujan/Chudnovsky Pi algorithm. 2x faster with many digits.
- Constants Euler, Pi, and Log2 are cached, just like Pari/GP, MPFR, etc.
All three are used quite a bit internally.
- Calling Pi or Euler in void context just calculates (and caches) the
value. This saves the expensive string conversion.
0.48 2017-10-05
[FIXES]
- Issues with 32-bit GMP on 64-bit platforms.
- Use log instead of logl.
0.47 2017-10-04
[ADDED]
- is_square(n) Returns 1 if n is a perfect square
- is_carmichael(n) Returns 1 if n is a Carmichael number
- is_fundamental(n) Returns 1 if n is a fundamental discriminant
- is_totient(n) Returns 1 if euler_phi(x) == n for some x
- is_polygonal(n,k) Returns 1 if n is a k-gonal number
- polygonal_nth(n,k) Returns N if n is the Nth k-gonal number
- logint(n,base) Integer log: largest e s.t. b^e <= n
- factorialmod(n,m) Returns n! mod m
- permtonum([...]) Returns rank of permutation array ref
- numtoperm(n,k) Returns kth permutation of n elems
- hammingweight(n) Returns bitwise population count of n
[FIXES]
- Random stream is identical on big-endian machines. RT 122718
[PERFORMANCE]
- Use new sieve marking for prime_iterator. Should give a very small
speedup to many functions.
- Remove unnecessary variable copy in AKS (is_primitive_root_uiprime).
- Slightly faster twin prime sieve by splitting BPSW test.
- Factoring is faster with new SQUFOF and native pbrent.
[OTHER]
- is_primitive_root internal func doesn't modify inputs.
- non-exported factor methods (e.g. squfof_factor, ecm_factor, etc.)
now always return smallest factor first.
- old native SQUFOF and GMP SQUFOF removed.
- On x86-64 use a very fast Pollard Rho Brent for 63-bit.
- On 64-bit platforms (long = 64-bit), use new SQUFOF126 which can
handle up to 126-bit inputs using only native math in the core.
This is about 10x faster than our old SQUFOF.
0.46 2017-04-17
[FIXES]
- Allow single argument to miller_rabin_random (implies one test).
- AKS on small inputs wasn't correctly calculating primitive roots.
0.45 2017-04-16
[FIXES]
- Remove use of exp2 which is C99 only.
- Trap negative bases sent to miller_rabin_random
0.44 2017-04-13
[ADDED]
- irand() Returns uniform random 32-bit integer
- irand64() Returns uniform random 64-bit integer
- drand([fmax]) Returns uniform random NV (floating point)
- urandomm(n) Returns uniform random integer in [0, hi-1]
- random_bytes(nbytes) Return a string of CSPRNG bytes
[FIXES]
- miller_rabin_random wasn't initializing a variable. Fixed and test
added. Thanks to Alexandr Ciornii for timely reporting.
- Fixed is_primitive_root behavior with negative values.
[PERFORMANCE]
- sieve_prime_cluster up to 2x faster.
[OTHER]
- prime_count(), random_prime(), urandomr() can be used with one arg.
0.43 2017-03-12
[ADDED]
- random_strong_prime(nbits) random strong prob prime of nbits bits
- random_maurer_prime(nbits) random nbits-bits proven prime
- random_shawe_taylor_prime(nbits) random nbits-bits proven prime
- random_maurer_prime_with_cert(nbits)
- random_shawe_taylor_prime_with_cert(nbits)
- urandomb(n) random number between 0 and 2^n-1
- urandomr(lo,hi) random number in [lo,hi], inclusive.
[PERFORMANCE]
- sieve_primes with small widths should perform much better.
0.42 2017-02-27
[ADDED]
- lambertw(x[,digits]) Lambert W function
- random_prime(a,b) random prob prime in range [a,b]
- random_nbit_prime(nbits) random prob prime of exactly nbits bits
- random_ndigit_prime(ndigs) random prob prime of exactly ndigs digits
- seed_csprng(bytes,data) supply a seed to the internal CSPRNG
- is_csprng_well_seeded() returns 1 if the CSPRNG has a proper seed
- is_semiprime(n) does n have exactly two prime factors
[FIXES]
- is_power behaviour for 1 and -1.
- is_nminus1_prime could assert on some inputs. Fix.
- chinese([3,0],[2,3]) made GMP go belly up. Found by Trizen.
- divisors(1) in list context would segfault. Found by Trizen.
[PERFORMANCE]
- Adjust zeta algorithm crossover for large precision. Makes a huge
difference for bern{frac/real} with values > 53000.
Thanks to Trizen for pointing this out.
- zeta works for all real values, returns undef for 1. It has issues
below -10 or so that need to be dealt with in a later release.
- is_primitive_root a bit faster with large inputs.
- stirling about 40% faster. Thanks to Karim Belabas.
[OTHER]
- The ISAAC CSPRNG has been added internally and all functions call it.
While it is quite fast it is slower than GMP's Mersenne Twister.
- On startup, we attempt to seed ISAAC with 256 bytes from /dev/urandom.
Callers can call is_csprng_well_seeded() to check if this succeeded,
and call as needed seed_csprng() to seed or reseed.
0.41 2016-10-09
[API CHANGES]
- bernreal and harmreal will use the second argument to mean the digits
of precision to use, rather than the number of digits past the decimal
place.
- is_pseudoprime and is_strong_pseudoprime act like Math::Prime::Util.
[ADDED]
- todigits(n[,base[,len]]) Convert number to digit array
- zeta(s[,digits]) Riemann Zeta of integer or FP s
- riemannr(s[,digits]) Riemann R function of integer or FP s
- divisors(n) Returns list of divisors
- is_euler_pseudoprime(n,@a) Euler-Jacobi primality test
[OTHER]
- With verbose >= 3, prints factors found in partial sieve.
- factor(1) returns empty list, just like non-GMP code.
- factor() went through a Perl layer for obsolete reasons. Removed.
- bernreal and bernfrac will use the Zeta/Pi method for large values,
making it orders of magnitude faster for large sizes.
- Added internal FP log, exp, pow functions, which are not in GMP.
- is_prime will do one extra M-R test for probable primes, down from 1-5.
Also, if is_provable_prime adds two Frobenius tests if returning a 1.
- Removed Perl layer from is_strong_pseudoprime.
- is_pseudoprime and is_strong_pseudoprime take a list of bases, and
there is no default base.
- sieve_primes with small n and large range (e.g. 10^20 to 10^20+8e9) is
much faster. This tunes the full vs. partial sieve crossover.
0.40 2016-08-01
[ADDED]
- sqrtint(n) Integer square root of n
- rootint(n,k) Integer k-th root of n
- is_prime_power(n) Returns k if n=p^k for p a prime.
[OTHER]
- is_perrin_pseudoprime 2x faster. Takes optional
second argument for additional restrictions.
0.39 2016-07-24
[ADDED]
- bernreal returns float value of Bernoulli number
- is_euler_plumb_pseudoprime Colin Plumb's Euler Criterion test
- surround_primes returns offsets of prev and next primes
[PERFORMANCE]
- prev/next/surround prime sieve is slightly deeper
- Add very simple composite filter for is_perrin_pseudoprime.
- Internal refactor of Miller-Rabin code to remove one mpz variable.
[OTHER]
- Add option for restricted Perrin pseudoprimes.
0.38 2016-06-18
[FIXES]
- Minor updates for Kwalitee.
- Rewrite of BLS75 internals, rewrite BLS75 hybrid.
- Remove two small memory leaks.
[PERFORMANCE]
- Less effort to prove primality in is_prime().
0.37 2016-06-06
[ADDED]
- is_nplus1_prime(n) BLS75 N+1 deterministic primality test
- is_bls75_prime(n) BLS75 N-1, N+1, combined primality tests
[FIXES]
- Fixed primorial on systems with not-new GMP, 8-byte UV, and 4-byte long.
- sieve_range should work with >32-bit depths on 64-bit Perl + 32-bit GMP.
0.36 2016-05-21
[ADDED]
- addmod (a + b) % n
- mulmod (a * b) % n
- divmod (a / b) % n
- powmod (a ^ b) % n
- invmod (1 / b) % n
- sqrtmod square root modulo a prime
- is_primitive_root(a,n) return 1 if 'a' is a primitive root mod n
- sieve_range(n,width,depth) sieve from n, returning candidate offsets
[FIXES]
- Allow a leading '+' in inputs.
[PERFORMANCE]
- znprimroot is much faster with large inputs.
- Speedup partial sieve with large input.
- next_prime and prev_prime sieve deeper. ~5% faster with large inputs.
- AKS using Bernstein (2003) theorem 4.1. 10-20x faster.
- Speedup for large pn_primorial and primorial. Much faster for very
large values, though it will all get swamped by the overhead in
returning the large value. This is a great reason to return mpz objects.
[OTHER]
- Split out factor, primality, and AKS code into separate source files.
0.35 2015-12-13
[FIXES]
- gcdext done manually for old GMP.
- fix memory leak in chinese
0.34 2015-10-14
[ADDED]
- sieve_prime_cluster(low,high,...) sieve clusters/constellations
[PERFORMANCE]
- Speedup partial sieve with large range.
[OTHER]
- Remove _GMP_trial_primes(), which was never exported.
- Internal restructuring of sieve_primes and sieve_twin_primes.
- is_frobenius_pseudoprime with arguments doesn't check for perfect
square, and works for small primes plus large params.
0.33 2015-09-04
[ADDED]
- sieve_twin_primes(low,high) sieve for twin primes
- is_miller_prime(n[,assumeGRH]) deterministic Miller test
[PERFORMANCE]
- New results from Sorenson and Webster let us give faster deterministic
results for 65-82 bits. is_prime always returns {0,2} for this range.
0.32 2015-08-16
[ADDED]
- chinese chinese remainder theorem
- sigma divisor sums
- ramanujan_tau Ramanujan's Tau function
0.31 2015-06-21
[PERFORMANCE]
- Minor speedup to partial sieve.
[OTHER]
- Allow working on old GMP versions.
0.30 2015-06-15
[ADDED]
- harmfrac returns (num,den) of Harmonic number
- harmreal returns float value of Harmonic number
- is_proth_prime(p) For k*2^n+1, returns -1, 0, or 2
- is_frobenius_khashin_pseudoprime returns 1 if Frob-Khashin prob prime
[FIXES]
- lucas sequence with even n fixed.
[PERFORMANCE]
- A Proth test was added to quickly prove numbers of the form k*2^n+1.
- LLR testing was improved using a method by Rödseth. This allows proofs
of k*2^n-1. The old method is still used, but was unable to quickly
test cases where k was divisible by 3. The new method handles these.
- BLS75-5 proof: use an expanding stack, allowing it to work on inputs
like: 'k * n# + 1'.
- BLS75-5 proof: remove some redundant computations.
0.29 2014-11-26
[ADDED]
- is_llr_prime(p) For k*2^n-1, returns -1, 0, or 2
- lucasu(P, Q, k) U_k for Lucas(P,Q)
- lucasv(P, Q, k) V_k for Lucas(P,Q)
[PERFORMANCE]
- is_prime will prove many Proth-form (h*2^n+1) numbers.
- is_provable_prime tries less hard to make a BLS75-T5 proof. Certs may
be longer, but performance is better.
- is_power is more efficient (recursion removed, only prime powers checked).
0.28 2014-11-17
[ADDED]
- is_mersenne_prime(p) returns 1 iff 2^p-1 is prime
[PERFORMANCE]
- is_prime will do a LLR test, as will is_provable_prime if not returning
a certificate. This means many primes of the form k*2^n-1 will run
faster and return 2 rather than 1.
- Update UV SQUFOF factoring code, faster factoring once reduced in size.
- Slightly better P-1 stage 2 performance.
- Slightly deeper trial division in general factoring.
- Big reduction in average depth of unfactored stack. We work on smaller
composite factors first, and add repeated factors all at once. This
fixes some pathological inputs such as:
vecprod( map { $_*($_+2)**17 } @{twin_primes(100000,115000)} )
which has 2574 factors and would overflow the 256-element stack. With
the new code it has a maximum stack depth of 3.
[OTHER]
- is_power works with negative powers, although doesn't return root.
0.27 2014-10-07
[PERFORMANCE]
- Minor changes to factor recipe, should give a little speedup.
- Cache ~32k worth of small primes to give a little speedup in many places.
- Switch to my original AGM code, slightly faster for large values.
- Add Goetgheluck binomial code, and switch to mpz_bin_uiui for builtin.
For large inputs this can be thousands of times faster than mpz_bin_ui.
[OTHER]
- Don't use mp_bitcnt_t -- old GMPs don't have this type.
0.26 2014-09-26
[ADDED]
- stirling(n,m,[type]) Stirling numbers of first,second,third kind
- vecprod(list) product of a list of integers
[OTHER]
- Cleanup invmod, etc. XS parser. Smaller code.
- Fixed some leaked mpz_t / mpz_f objects.
0.25 2014-09-23
- Fixed compiler warning (error for some compilers).
- prev_prime uses a sieve for 200+ bits. 20% speedup for large inputs.
0.24 2014-09-22
[ADDED]
- sieve_primes(low,high[,k]) sieve for primes, partial or BPSW
- is_frobenius_pseudoprime(n,[a,b]) Frobenius quadratic primality test
- is_perrin_pseudoprime(n) Perrin primality test
- factorial(n) n!
- bernfrac returns (num,den) of Bernoulli number
- Pi([digits]) Pi with requested number of digits
[OTHER]
- next_prime will use a partial sieve for 120+ bit inputs. For large
inputs this is a 15-30% speedup. For 2469*2617#/93030-12182 I get:
= 392.2s OpenPFGW 3.7.7
= 220.6s Pari/GP 2.6.2
= 128.4s GMP 5.0.2 mpz_nextprime
= 57.6s old MPU
= 45.5s new MPU
- New version of Frobenius-Underwood test to match the 2014 draft paper.
This is just a code refresh and has no other effect.
- BLS75 with effort 1 toned down. This makes is_prime with 65- to 200-bit
inputs faster, though a bit less likely to return with the value 2
rather than 1. It's a couple percent fewer, but 10-60% faster.
0.23 2014-08-16
- Fat comma isn't fat for numbers, garbled test hashes on 32-bit.
0.22 2014-08-16
[ADDED]
- moebius(n[,nhi]) Moebius function (single or ranged)
- liouville(n) Liouville function
- totient(n) Euler's Totient function (single)
- jordan_totient(k, n) Jordan totient
- carmichael_lambda(n) Carmichael Lambda (reduced totient)
- znorder(a, n) multiplicative order of a mod n
- znprimroot(n) least primitive root of n
[OTHER]
- Moved factoring loop out of XS file.
- factor does much better power splitting, similar to MPU 0.38's code:
time mpu 'use bigint; my $n = next_prime(10**20)**200; say join(" ", map {"[@$_]"} factor_exp($n));'
time mpu 'use bigint; my $n = next_prime(10**21)**200 * next_prime(10**20)**200; say join(" ", map {"[@$_]"} factor_exp($n));'
- Fix spelling of Paul Zimmermann's name (thanks to Mathew @ mersenneforum)
- Standalone ECPP now does expression parsing using the GMP 6.0.0a demo
code. Version bumped to 1.04.
0.21 2014-06-19
- Used a bare 64-bit in a test. Wrap in quotes.
0.20 2014-06-18
[ADDED]
- valuation(a,b) how many times does b divide a?
- invmod(a,n) inverse of a modulo n
- is_pseudoprime(n,base) Simple Fermat test
- binomial(n,k) binomial coefficient
- gcdext(a,b) extended Euclidian algorithm
- vecsum(...) sum list of integers
[OTHER]
- 10%-ish speedup for next/prev prime with 38-950 digit inputs.
0.19 2014-04-21
[ADDED]
- is_power
- exp_mangoldt
[FIXES]
- Fixed string shortcut for simple divisibility. is_prime and related
functions are a bit faster when given inputs divisible by 2 or 5.
[OTHER]
- Add improved AKS parameter selection. About 200x faster, though still
thousands of times slower than APR-CL or ECPP. Updated times for the
example in the v0.10 entry: Timing for 10**100+267:
AKS: ~5 days.
BLS75 n-1: ~3 minutes.
APR-CL: 0.09 seconds
ECPP: 0.05 seconds.
- ECPP performance adjustments, version 1.03 of standalone ECPP.
- Updated ECPP class polynomial data. Default "tiny" table had very minor
changes. The "big" table (in the github xt/ directory, default for
standalone ECPP) removed some large coefficient 17-24 degree polys to
make room for many more higher-degree polys. For some ranges this may
mean more backtracking, but should expand the input size that is able to
find good discriminants without high factoring effort. "prob" below is
summing the estimate 1/2H: 9x more polys and 66x larger size gives on
average about 3x more candidates.
Default "tiny" table:
OLD: 30373 bytes 604 polys 24 maxdeg 42.0 prob 1450 prob/MB
NEW: 30422 bytes 611 polys 25 maxdeg 42.8 prob 1475 prob/MB
"big" table at www.probableprime.org/ecpp/cpd/big/class_poly_data.h.gz
OLD: 2032376 bytes 3197 polys 117 maxdeg 104.5 prob 54 prob/MB
NEW: 2005072 bytes 5271 polys 85 maxdeg 125.2 prob 65 prob/MB
"huge" table at www.probableprime.org/ecpp/cpd/huge/class_poly_data.h.gz
15724395 bytes 14571 polys 128 maxdeg 207.9 prob 14 prob/MB
0.18 2014-01-27
[FIXES]
- Fix for 5.6.2 (undefined symbol).
- Fix for unsigned long != UV, reported by CHORNY.
0.17 2014-01-24
[ADDED]
- is_bpsw_prime specific BPSW-only test
- gcd 20-50x faster than Math::BigInt
- lcm 3-800x faster than Math::BigInt
- kronecker
[FIXES]
- Factoring with a number or intermediate near the word boundary would
hang or run very slow. Thanks to Hugo van der Sanden for the report.
- Next version of vcert.c, which handles some new Primo changes.
0.16 2013-10-28
[ADDED]
- partitions partition function p(n), OEIS A000041
[FIXES]
- Fixed memory leak in Lucas sequence (is_prime, next_prime, etc.).
- is_aks_prime wasn't properly checking divisibility for composites.
[Scripts and Programs Added]
- verify_primegap.pl parallel prime gap verification
0.15 2013-09-30
[Functions Added]
- miller_rabin_random
- A tree sieve is done in trial factor for large (900+ digits) inputs.
This improves performance greatly for very large inputs.
- is_prob_prime uses more trial division for large inputs. For very
large inputs (e.g. 50,000+ digits) this can greatly speed up probable
prime testing, for instance in next_prime or similar sieving.
Time for next_prime(99992 * 10**10101 - 100):
1m 4s MPUGMP 0.15
3m 34s Pari/GP (needs 450MB of stack!)
4m 1s mpz_nextprime
9m 33s Math::Primality
- Use shallow product tree for primorials. Large primorials are 2 to 12
times faster. Break consecutive_integer_lcm into four sub-products so
it runs 2-4x faster for large inputs.
- Trim ECPP and adjust its heuristics.
- Standalone ECPP now has consistent return codes, making it easier to
use in applications without having to parse return text. The return
codes are consistent with the certificate verifier.
- factor() in scalar context is now consistent.
0.14 2013-08-07
- Fix small certificates leaving out the "N " for small numbers.
0.13 2013-08-06
[API Changes]
- Primality proofs now use a text certificate. This is nicer for
external interaction, but is a change from previous behavior. You
will need to use Math::Prime::Util 0.30 or newer.
[Functions Added]
- lucas_sequence
- is_almost_extra_strong_lucas_pseudoprime
- is_frobenius_underwood_pseudoprime
- pplus1_factor
[Enhancements]
- is_prob_prime now uses the extra-strong Lucas test instead of the
strong Lucas test. This gives better performance. is_prime and
is_provable_prime also incorporate the change.
- Added more trial division to is_prob_prime for big (100+ digit)
numbers. This is a significant speedup for next_prime in many cases.
Pari/gp 2.6.0 nextprime(10^4000) 19 minutes
MPU:GMP 0.12 next_prime(10**4000) 15 minutes
MPU:GMP 0.13 next_prime(10**4000) 8 minutes
- ECPP now tries partial n-1 and n+1 proofs (BLS theorem 3 / 15) at each
step, and adds a couple additional quick factoring tests. This mainly
helps lower the time variability with large inputs.
- Updated ECPP polynomials. Should give better performance with larger
inputs.
[Scripts and Programs Added]
- convert-primo-cert.pl convert a Primo certificate to MPU format.
- verify-cert.pl Verify a Primo or MPU certificate.
- vcert.c Verify a Primo or MPU certificate.
0.12 2013-06-12
- add standard and extra strong Lucas probable prime tests.
- Rearrange C code to allow standalone build of ECPP.
- Speedups for ECPP.
0.11 2013-05-20
- is_prob_prime is faster at finding composites.
- rewrote Lucas inner loop for ~20% speedup.
- The previous two changes make is_prob_prime a bit faster, which means
a small speedup to almost all functions.
- Lower is_prime proving effort. Proves ~30% of 128-bit primes instead
of 50%, but runs about 4x faster.
- Change ECPP to factor all strategy with backtracking. Not much
difference below 200 digits, but a big help after that. Certificates
are identical.
0.10 2013-05-07
- ECPP -- a much faster primality prover. BLS75 n-1 works well to about
40 digits, then slows down rapidly. This ECPP implementation is good
to 300-500 digits. Timing for 10**100+267:
AKS: ~1 year. BLS75 n-1: 1.5-5 minutes. ECPP: 0.1 seconds.
- is_prime does an additional 4 random-base M-R tests.
- is_provable_prime will try a quick n-1 then do ECPP.
- is_nminus1_prime added to give access to that specific method, in
case someone has reason to insist on that proof type.
- Change polynomial multiplication to use binary segmentation. Huge
speed improvement for AKS primality proving (20-100x faster). AKS
is now faster in GMP than MPU's C code. It's still not nearly as fast
as other methods: proving 100000000003 takes 65 seconds, while this
would take a couple milliseconds at most for an n-1 proof. The one year
estimate in the first paragraph is with the _new_ code.
- Compile-time support to BLS75 theorem 7, which reduces the amount of
n-1 we need to factor. Not enabling because it just doesn't help
enough, and ECPP is a better place to spend development effort.
- Lots of new internal functions to support ECPP, which could be used
for future projects.
0.09 2013-04-21
- Add primality certificate generation.
0.08 2013-04-05
- Switch to a projective ECM with a stage 2. Much better results, but
note that it doesn't build up to B1 like the old version. This has
a big impact on factoring and primality proving.
- Add a QS based on William Hart's SIMPQS (a simple QS that is a
predecessor to what went into FLINT). Not the fastest by a long shot
(yafu and msieve take that prize), but it's quite small and works pretty
well. Eventually this will get replaced with a home-built QS. Meanwhile
some improvements from version 2.0 that remain are (1) no partial
relations, (2) uses too much memory, and (3) uses GE instead of
jasonp's block Lanczos.
- The new ECM and QS make factoring much faster, especially for 30+
digit inputs. Factoring should give reasonable times out to 70+
digits now. Time is competitive with Math::Pari now, and often faster
(noting that Math::Pari uses a fairly old version of Pari).
- Factoring mix redone given the big changes in ECM and QS.
- Primality proofs adjusted to better use p-1 and ECM. The quick proof
in is_prime has a higher success rate for all input sizes and is a
little faster for small numbers. is_provable_prime is 10-50x faster.
0.07 2013-03-19
- Tiny speedup when passing in bigints.
- Some speedups in pbrent, pbrent usage, and small prime iterator.
Factoring small (< ~30 digit) numbers is faster.
- Handle large and small M-R bases just like MPU does -- mod with n,
then return 1 if base <= 1 or base >= n-1.
0.06 2012-12-17
- Fix 1-byte memory overrun (thanks to CPAN Testers, Solaris, Valgrind).
- Add factoring of small numbers. Helps a little when the input gets
reduced enough to fit into a UV.
0.05 2012-12-15
- Add AKS primality test. Super slow, but nice to have around.
- ECM is faster.
- Add a small prime iterator, which means _much_ less memory and faster
operation for big smoothness factors in pminus1 and ecm factoring.
0.04 2012-11-11
- Add simple prime_count function. It uses next_prime so is terribly slow
for big ranges. However it's a lot faster than the PP code when given
a large base and small range e.g. (10**96, 10**96 + 2**18).
- Add primorial, pn_primorial, and consecutive_integer_lcm functions.
- Factoring:
Add a perfect power test.
Add a simple ECM factoring method.
Speed up SQUFOF a bit.
Complete p-1 rewrite. Much faster and finds more factors.
Adjust general factor() mix.
- Add Pocklington-Lehmer and BLS primality tests. is_prime() uses the
BLS test with a quick factoring attempt for numbers less than 2^200,
though the chances of success drop off as the size increases.
The point is not to cull mismarked probable primes (we use BPSW so this
is highly unlikely for these small sizes), but to quickly mark more
numbers as definitely prime. Remember to use is_prob_prime if you do
not care about this distinction and want the result slightly faster.
- add is_provable_prime function that calls BLS with much more aggressive
factoring.
0.03 2012-07-16
- XS callable: _lcm_of_consecutive_integers(B)
which is a better alternative for B! for many factoring algorithms.
- Fix some minor compile issues.
0.02 2012-07-15
- Factoring tests assumed 64-bit. Rewrite.
0.01 2012-07-15
- Initial release
|