From 858404023b133dd6d1307095fbb9aebd4379ff75 Mon Sep 17 00:00:00 2001 From: Simon Byrne Date: Fri, 27 May 2016 01:09:57 +0100 Subject: [PATCH] Deprecate prime number functions (`isprime`, `primes`, `primesmask`, `factor`) (#16481) * Remove primes docs from rst, add a NEWS.md entry * Deprecate prime number functions (`isprime`, `primes`, `primesmask`, `factor`) See #16357 * remove primes functions completely, similar to combinatorics --- NEWS.md | 5 +- base/deprecated.jl | 10 ++ base/docs/helpdb/Base.jl | 58 ------- base/exports.jl | 4 - base/gmp.jl | 4 +- base/primes.jl | 206 ------------------------- base/sysimg.jl | 2 - contrib/BBEditTextWrangler-julia.plist | 4 - doc/manual/arrays.rst | 13 +- doc/stdlib/math.rst | 13 -- doc/stdlib/numbers.rst | 34 ---- test/bigint.jl | 6 - test/euler.jl | 9 -- test/numbers.jl | 176 --------------------- 14 files changed, 21 insertions(+), 523 deletions(-) delete mode 100644 base/primes.jl diff --git a/NEWS.md b/NEWS.md index 2b924408a5636..5d6e48b217c7d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -90,7 +90,7 @@ Breaking changes Library improvements -------------------- - * Most of the combinatorics functions have been moved from `Base` + * Most of the combinatorics functions have been moved from `Base` to the [Combinatorics.jl package](https://github.com/JuliaLang/Combinatorics.jl) ([#13897]). * Packages: @@ -173,6 +173,9 @@ Library improvements or `is_apple()`. There's now also an `@static` macro that will evaluate the condition of an if-statement at compile time, for when a static branch is required ([#16219]). + * Prime number related functions have been moved from `Base` to the + [Primes.jl package](https://github.com/JuliaMath/Primes.jl) ([#16481]). + Deprecated or removed --------------------- diff --git a/base/deprecated.jl b/base/deprecated.jl index 142f5d6a57c54..fded63de1402e 100644 --- a/base/deprecated.jl +++ b/base/deprecated.jl @@ -934,6 +934,16 @@ for deprecatedfunc in [:combinations, :factorial, :prevprod, :levicivita, end end +# Primes functions that have been moved out of base (#16481) +for deprecatedfunc in [:isprime, :primes, :primesmask, :factor] + @eval begin + $deprecatedfunc(args...) = error(string($deprecatedfunc, args, + " has been moved to the package Primes.jl.\n", + "Run Pkg.add(\"Primes\") to install Primes on Julia v0.5-")) + export $deprecatedfunc + end +end + #14335 @deprecate super(T::DataType) supertype(T) diff --git a/base/docs/helpdb/Base.jl b/base/docs/helpdb/Base.jl index 192885623dbb3..54516e9a4f685 100644 --- a/base/docs/helpdb/Base.jl +++ b/base/docs/helpdb/Base.jl @@ -1291,21 +1291,6 @@ is equivalent to `!isapprox(x,y)`. """ isapprox -""" - primes([lo,] hi) - -Returns a collection of the prime numbers (from `lo`, if specified) up to `hi`. -""" -primes - -""" - primesmask([lo,] hi) - -Returns a prime sieve, as a `BitArray`, of the positive integers (from `lo`, if specified) -up to `hi`. Useful when working with either primes or composite numbers. -""" -primesmask - """ sinh(x) @@ -7719,23 +7704,6 @@ the same as the way an object is printed in the Julia REPL.) """ TextDisplay -""" - factor(n) -> Dict - -Compute the prime factorization of an integer `n`. Returns a dictionary. The keys of the -dictionary correspond to the factors, and hence are of the same type as `n`. The value -associated with each key indicates the number of times the factor appears in the -factorization. - -```jldoctest -julia> factor(100) # == 2*2*5*5 -Dict{Int64,Int64} with 2 entries: - 2 => 2 - 5 => 2 -``` -""" -factor - """ ismatch(r::Regex, s::AbstractString) -> Bool @@ -8391,32 +8359,6 @@ any element type for which `dot` is defined), compute the Euclidean dot product """ vecdot -""" - isprime(x::Integer) -> Bool - -Returns `true` if `x` is prime, and `false` otherwise. - -```jldoctest -julia> isprime(3) -true -``` -""" -isprime(::Integer) - -""" - isprime(x::BigInt, [reps = 25]) -> Bool - -Probabilistic primality test. Returns `true` if `x` is prime; and `false` if `x` is not -prime with high probability. The false positive rate is about `0.25^reps`. `reps = 25` is -considered safe for cryptographic applications (Knuth, Seminumerical Algorithms). - -```jldoctest -julia> isprime(big(3)) -true -``` -""" -isprime(::BigInt, ?) - """ >(x, y) diff --git a/base/exports.jl b/base/exports.jl index e3e54124b3494..162a98484bc56 100644 --- a/base/exports.jl +++ b/base/exports.jl @@ -351,7 +351,6 @@ export exp2, expm1, exponent, - factor, factorial, fld, fld1, @@ -380,7 +379,6 @@ export isnan, isodd, ispow2, - isprime, isqrt, isreal, isimag, @@ -412,8 +410,6 @@ export prevfloat, prevpow, prevpow2, - primes, - primesmask, rad2deg, rationalize, real, diff --git a/base/gmp.jl b/base/gmp.jl index 004ec803a48e9..606d384e1323c 100644 --- a/base/gmp.jl +++ b/base/gmp.jl @@ -6,7 +6,7 @@ export BigInt import Base: *, +, -, /, <, <<, >>, >>>, <=, ==, >, >=, ^, (~), (&), (|), ($), binomial, cmp, convert, div, divrem, factorial, fld, gcd, gcdx, lcm, mod, - ndigits, promote_rule, rem, show, isqrt, string, isprime, powermod, + ndigits, promote_rule, rem, show, isqrt, string, powermod, sum, trailing_zeros, trailing_ones, count_ones, base, tryparse_internal, bin, oct, dec, hex, isequal, invmod, prevpow2, nextpow2, ndigits0z, widen, signed, unsafe_trunc, trunc @@ -541,8 +541,6 @@ function ndigits0z(x::BigInt, b::Integer=10) end ndigits(x::BigInt, b::Integer=10) = x.size == 0 ? 1 : ndigits0z(x,b) -isprime(x::BigInt, reps=25) = ccall((:__gmpz_probab_prime_p,:libgmp), Cint, (Ptr{BigInt}, Cint), &x, reps) > 0 - prevpow2(x::BigInt) = x.size < 0 ? -prevpow2(-x) : (x <= 2 ? x : one(BigInt) << (ndigits(x, 2)-1)) nextpow2(x::BigInt) = x.size < 0 ? -nextpow2(-x) : (x <= 2 ? x : one(BigInt) << ndigits(x-1, 2)) diff --git a/base/primes.jl b/base/primes.jl deleted file mode 100644 index 52d57d6bc9266..0000000000000 --- a/base/primes.jl +++ /dev/null @@ -1,206 +0,0 @@ -# This file is a part of Julia. License is MIT: http://julialang.org/license - -# Primes generating functions -# https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes -# https://en.wikipedia.org/wiki/Wheel_factorization -# http://primesieve.org -# Jonathan Sorenson, "An analysis of two prime number sieves", Computer Science Technical Report Vol. 1028, 1991 -const wheel = [4, 2, 4, 2, 4, 6, 2, 6] -const wheel_primes = [7, 11, 13, 17, 19, 23, 29, 31] -const wheel_indices = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7] - -@inline wheel_index(n) = ( (d, r) = divrem(n - 1, 30); return 8d + wheel_indices[r+2] ) -@inline wheel_prime(n) = ( (d, r) = ((n - 1) >>> 3, (n - 1) & 7); return 30d + wheel_primes[r+1] ) - -function _primesmask(limit::Int) - limit < 7 && throw(ArgumentError("limit must be at least 7, got $limit")) - n = wheel_index(limit) - m = wheel_prime(n) - sieve = ones(Bool, n) - @inbounds for i = 1:wheel_index(isqrt(limit)) - if sieve[i]; p = wheel_prime(i) - q = p * p - j = (i - 1) & 7 + 1 - while q ≤ m - sieve[wheel_index(q)] = false - q = q + wheel[j] * p - j = j & 7 + 1 - end - end - end - return sieve -end - -function _primesmask(lo::Int, hi::Int) - 7 ≤ lo ≤ hi || throw(ArgumentError("the condition 7 ≤ lo ≤ hi must be met")) - lo == 7 && return _primesmask(hi) - wlo, whi = wheel_index(lo - 1), wheel_index(hi) - m = wheel_prime(whi) - sieve = ones(Bool, whi - wlo) - hi < 49 && return sieve - small_sieve = _primesmask(isqrt(hi)) - @inbounds for i = 1:length(small_sieve) # don't use eachindex here - if small_sieve[i]; p = wheel_prime(i) - j = wheel_index(2 * div(lo - p - 1, 2p) + 1) - q = p * wheel_prime(j + 1); j = j & 7 + 1 - while q ≤ m - sieve[wheel_index(q)-wlo] = false - q = q + wheel[j] * p - j = j & 7 + 1 - end - end - end - return sieve -end - -# Sieve of the primes from lo up to hi represented as an array of booleans -function primesmask(lo::Int, hi::Int) - 0 < lo ≤ hi || throw(ArgumentError("the condition 0 < lo ≤ hi must be met")) - sieve = falses(hi - lo + 1) - lo ≤ 2 ≤ hi && (sieve[3-lo] = true) - lo ≤ 3 ≤ hi && (sieve[4-lo] = true) - lo ≤ 5 ≤ hi && (sieve[6-lo] = true) - hi < 7 && return sieve - wheel_sieve = _primesmask(max(7, lo), hi) - lsi = lo - 1 - lwi = wheel_index(lsi) - @inbounds for i = 1:length(wheel_sieve) # don't use eachindex here - sieve[wheel_prime(i + lwi) - lsi] = wheel_sieve[i] - end - return sieve -end -primesmask{T<:Integer}(lo::T, hi::T) = lo <= hi <= typemax(Int) ? primesmask(Int(lo), Int(hi)) : - throw(ArgumentError("both endpoints of the interval to sieve must be ≤ $(typemax(Int)), got $lo and $hi")) - -primesmask(limit::Int) = primesmask(1, limit) -primesmask(n::Integer) = n <= typemax(Int) ? primesmask(Int(n)) : - throw(ArgumentError("requested number of primes must be ≤ $(typemax(Int)), got $n")) - -function primes(lo::Int, hi::Int) - lo ≤ hi || throw(ArgumentError("the condition lo ≤ hi must be met")) - list = Int[] - lo ≤ 2 ≤ hi && push!(list, 2) - lo ≤ 3 ≤ hi && push!(list, 3) - lo ≤ 5 ≤ hi && push!(list, 5) - hi < 7 && return list - sizehint!(list, floor(Int, hi / log(hi))) - sieve = _primesmask(max(7, lo), hi) - lwi = wheel_index(lo - 1) - @inbounds for i = 1:length(sieve) # don't use eachindex here - sieve[i] && push!(list, wheel_prime(i + lwi)) - end - return list -end -primes(n::Int) = primes(1, n) - -const PRIMES = primes(2^16) - -# Small precomputed primes + Miller-Rabin for primality testing: -# https://en.wikipedia.org/wiki/Miller–Rabin_primality_test -# -function isprime(n::Integer) - (n < 3 || iseven(n)) && return n == 2 - n <= 2^16 && return PRIMES[searchsortedlast(PRIMES,n)] == n - s = trailing_zeros(n-1) - d = (n-1) >>> s - for a in witnesses(n) - x = powermod(a,d,n) - x == 1 && continue - t = s - while x != n-1 - (t-=1) <= 0 && return false - x = oftype(n, widemul(x,x) % n) - x == 1 && return false - end - end - return true -end - -# Miller-Rabin witness choices based on: -# http://mathoverflow.net/questions/101922/smallest-collection-of-bases-for-prime-testing-of-64-bit-numbers -# http://primes.utm.edu/prove/merged.html -# http://miller-rabin.appspot.com -# -witnesses(n::Union{UInt8,Int8,UInt16,Int16}) = (2,3) -witnesses(n::Union{UInt32,Int32}) = n < 1373653 ? (2,3) : (2,7,61) -witnesses(n::Union{UInt64,Int64}) = - n < 1373653 ? (2,3) : - n < 4759123141 ? (2,7,61) : - n < 2152302898747 ? (2,3,5,7,11) : - n < 3474749660383 ? (2,3,5,7,11,13) : - (2,325,9375,28178,450775,9780504,1795265022) - -isprime(n::UInt128) = - n <= typemax(UInt64) ? isprime(UInt64(n)) : isprime(BigInt(n)) -isprime(n::Int128) = n < 2 ? false : - n <= typemax(Int64) ? isprime(Int64(n)) : isprime(BigInt(n)) - - -# Trial division of small (< 2^16) precomputed primes + -# Pollard rho's algorithm with Richard P. Brent optimizations -# https://en.wikipedia.org/wiki/Trial_division -# https://en.wikipedia.org/wiki/Pollard%27s_rho_algorithm -# http://maths-people.anu.edu.au/~brent/pub/pub051.html -# -function factor{T<:Integer}(n::T) - 0 < n || throw(ArgumentError("number to be factored must be ≥ 0, got $n")) - h = Dict{T,Int}() - n == 1 && return h - isprime(n) && (h[n] = 1; return h) - local p::T - for p in PRIMES - if n % p == 0 - h[p] = get(h,p,0)+1 - n = div(n,p) - while n % p == 0 - h[p] = get(h,p,0)+1 - n = div(n,p) - end - n == 1 && return h - isprime(n) && (h[n] = 1; return h) - end - end - T <: BigInt || widemul(n-1,n-1) <= typemax(n) ? pollardfactors!(n, h) : pollardfactors!(widen(n), h) -end - -function pollardfactors!{T<:Integer,K<:Integer}(n::T, h::Dict{K,Int}) - while true - local c::T = rand(1:(n-1)), G::T = 1, r::K = 1, y::T = rand(0:(n-1)), m::K = 1900 - local ys::T, q::T = 1, x::T - while c == n - 2 - c = rand(1:(n-1)) - end - while G == 1 - x = y - for i in 1:r - y = (y*y)%n - y = (y+c)%n - end - local k::K = 0 - G = 1 - while k < r && G == 1 - for i in 1:(m>(r-k)?(r-k):m) - ys = y - y = (y*y)%n - y = (y+c)%n - q = (q*(x>y?x-y:y-x))%n - end - G = gcd(q,n) - k = k + m - end - r = 2 * r - end - G == n && (G = 1) - while G == 1 - ys = (ys*ys)%n - ys = (ys+c)%n - G = gcd(x>ys?x-ys:ys-x,n) - end - if G != n - isprime(G) ? h[G] = get(h,G,0) + 1 : pollardfactors!(G,h) - G2 = div(n,G) - isprime(G2) ? h[G2] = get(h,G2,0) + 1 : pollardfactors!(G2,h) - return h - end - end -end diff --git a/base/sysimg.jl b/base/sysimg.jl index c5ae20327a50b..0991f6d58d2ea 100644 --- a/base/sysimg.jl +++ b/base/sysimg.jl @@ -179,8 +179,6 @@ include("multidimensional.jl") include("permuteddimsarray.jl") using .PermutedDimsArrays -include("primes.jl") - let SOURCE_PATH = "" global include = function(path) prev = SOURCE_PATH diff --git a/contrib/BBEditTextWrangler-julia.plist b/contrib/BBEditTextWrangler-julia.plist index fcb01a678c577..2e0a4a5a19a09 100644 --- a/contrib/BBEditTextWrangler-julia.plist +++ b/contrib/BBEditTextWrangler-julia.plist @@ -423,7 +423,6 @@ export extrema eye - factor factorial factorize falses @@ -633,7 +632,6 @@ isposdef! isposdef ispow2 - isprime isprint ispunct isqrt @@ -849,8 +847,6 @@ prevind prevpow2 prevpow - primes - primesmask print print_escaped print_joined diff --git a/doc/manual/arrays.rst b/doc/manual/arrays.rst index c0b03cd4763c4..fd2fd6b3037f7 100644 --- a/doc/manual/arrays.rst +++ b/doc/manual/arrays.rst @@ -319,14 +319,13 @@ Example: 6 10 7 11 - julia> x[map(isprime, x)] - 6-element Array{Int64,1}: + julia> x[map(ispow2, x)] + 5-element Array{Int64,1}: + 1 2 - 3 - 5 - 7 - 11 - 13 + 4 + 8 + 16 julia> x[1, [2 3; 4 1]] 2x2 Array{Int64,2}: diff --git a/doc/stdlib/math.rst b/doc/stdlib/math.rst index fea8aeb27377d..46529bfdd07e9 100644 --- a/doc/stdlib/math.rst +++ b/doc/stdlib/math.rst @@ -1359,19 +1359,6 @@ Mathematical Functions Compute ``factorial(n)/factorial(k)``\ . -.. function:: factor(n) -> Dict - - .. Docstring generated from Julia source - - Compute the prime factorization of an integer ``n``\ . Returns a dictionary. The keys of the dictionary correspond to the factors, and hence are of the same type as ``n``\ . The value associated with each key indicates the number of times the factor appears in the factorization. - - .. doctest:: - - julia> factor(100) # == 2*2*5*5 - Dict{Int64,Int64} with 2 entries: - 2 => 2 - 5 => 2 - .. function:: gcd(x,y) .. Docstring generated from Julia source diff --git a/doc/stdlib/numbers.rst b/doc/stdlib/numbers.rst index 2b55a16149bab..62d672eab244f 100644 --- a/doc/stdlib/numbers.rst +++ b/doc/stdlib/numbers.rst @@ -455,40 +455,6 @@ Integers julia> trailing_ones(3) 2 -.. function:: isprime(x::Integer) -> Bool - - .. Docstring generated from Julia source - - Returns ``true`` if ``x`` is prime, and ``false`` otherwise. - - .. doctest:: - - julia> isprime(3) - true - -.. function:: isprime(x::BigInt, [reps = 25]) -> Bool - - .. Docstring generated from Julia source - - Probabilistic primality test. Returns ``true`` if ``x`` is prime; and ``false`` if ``x`` is not prime with high probability. The false positive rate is about ``0.25^reps``\ . ``reps = 25`` is considered safe for cryptographic applications (Knuth, Seminumerical Algorithms). - - .. doctest:: - - julia> isprime(big(3)) - true - -.. function:: primes([lo,] hi) - - .. Docstring generated from Julia source - - Returns a collection of the prime numbers (from ``lo``\ , if specified) up to ``hi``\ . - -.. function:: primesmask([lo,] hi) - - .. Docstring generated from Julia source - - Returns a prime sieve, as a ``BitArray``\ , of the positive integers (from ``lo``\ , if specified) up to ``hi``\ . Useful when working with either primes or composite numbers. - .. function:: isodd(x::Integer) -> Bool .. Docstring generated from Julia source diff --git a/test/bigint.jl b/test/bigint.jl index e2946d575d259..4e4554e736788 100644 --- a/test/bigint.jl +++ b/test/bigint.jl @@ -217,12 +217,6 @@ g = parse(BigInt,"-1") @test (|)(a, b, c, d, f) == parse(BigInt,"-1358954753") @test (|)(a, b, c, d, f, g) == parse(BigInt,"-1") -@test isprime(BigInt(1000000007)) -@test isprime(BigInt(1000000007), 1) -@test isprime(BigInt(10000000019)) -@test isprime(parse(BigInt,"359334085968622831041960188598043661065388726959079837")) -@test !isprime(BigInt(1)) -@test !isprime(BigInt(10000000020)) @test trailing_ones(a) == 8 @test trailing_zeros(b) == 2 diff --git a/test/euler.jl b/test/euler.jl index b3aef922012ab..d4ef4744831f7 100644 --- a/test/euler.jl +++ b/test/euler.jl @@ -21,9 +21,6 @@ function euler2(n) end @test euler2(4000000) == 4613732 -#3: 6857 -@test maximum(keys(factor(600851475143))) == 6857 - #4: 906609 function euler4(n) m = 1 @@ -47,10 +44,6 @@ end #6: 25164150 @test sum(1:100)^2 - sum((1:100).^2) == 25164150 -#7: 104743 -euler7(n) = primes(floor(Int,n*log(n*log(n))))[n] -@test euler7(10001) == 104743 - #8: 40824 function euler8(n,m) d = digits(n) @@ -68,8 +61,6 @@ function euler9(n) end @test euler9(1000) == 31875000 -#10: 142913828922 -@test sum(map(Int64,primes(2000000))) == 142913828922 #11: 70600674 function euler11(grid,n) diff --git a/test/numbers.jl b/test/numbers.jl index 73eaa0c0dd363..8e220dcaecf7a 100644 --- a/test/numbers.jl +++ b/test/numbers.jl @@ -1747,13 +1747,6 @@ end @test_throws InexactError round(UInt32, 4.2949673f9) @test round(UInt32, 4.294967f9) == 0xffffff00 -for n = 1:100 - m = 1 - for (p,k) in factor(n) - m *= p^k - end - @test n == m -end for Ti in [Int,UInt] for Tf in [Float16,Float32,Float64] @@ -2137,174 +2130,10 @@ for f in (trunc, round, floor, ceil) # issue 16311 rationalize(nextfloat(0.0)) == 0//1 - -# primes - -@test primes(10000) == primes(2, 10000) == [ - 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, - 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, - 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, - 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, - 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, - 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, - 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, - 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, - 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, - 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, - 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, - 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, - 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, - 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, - 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, - 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, - 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, - 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, - 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, - 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, - 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, - 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, - 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, - 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, - 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, - 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, - 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, - 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, - 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, - 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, - 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, - 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, - 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, - 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, - 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, - 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, - 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, - 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, - 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, - 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, - 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, - 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, - 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, - 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, - 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, - 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, - 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, - 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, - 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, - 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, - 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, - 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, - 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, - 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, - 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, - 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, - 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, - 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, - 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, - 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, - 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, - 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, - 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, - 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, - 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, - 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, - 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, - 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, - 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, - 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, - 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, - 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, - 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, - 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, - 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, - 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, - 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, - 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, - 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, - 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, - 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, - 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, - 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, - 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, - 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, - 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, - 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, - 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, - 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, - 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, - 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, - 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, - 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, - 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, - 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, - 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, - 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, - 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, - 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, - 9949, 9967, 9973 ] - -for n = 100:100:1000 - @test primes(n, 10n) == primes(10n)[length(primes(n))+1:end] - @test primesmask(n, 10n) == primesmask(10n)[n:end] -end - -for T in [Int,BigInt], n = [1:1000;1000000] - n = convert(T,n) - f = factor(n) - @test n == prod(T[p^k for (p,k)=f]) - prime = n!=1 && length(f)==1 && get(f,n,0)==1 - @test isprime(n) == prime - - s = primesmask(n) - for k = 1:n - @test s[k] == isprime(k) - @test s[k] == primesmask(k, k)[1] - end -end - -@test !isprime(1000000003) -@test !isprime(1000000005) -@test isprime(1000000007) -@test isprime(1000000009) -@test !isprime(1000000011) -@test !isprime(1000000013) - -@test !isprime(10000000015) -@test !isprime(10000000017) -@test isprime(10000000019) -@test !isprime(10000000021) -@test !isprime(10000000023) - -@test !isprime(9223372036854775779) -@test !isprime(9223372036854775781) -@test isprime(9223372036854775783) -@test !isprime(9223372036854775785) -@test !isprime(9223372036854775787) - -@test !isprime(0xffffffffffffffc1) -@test !isprime(0xffffffffffffffc3) -@test isprime(0xffffffffffffffc5) -@test !isprime(0xffffffffffffffc7) -@test !isprime(0xffffffffffffffc9) - -for T in [Int8,UInt8,Int16,UInt16,Int128,UInt128] - @test isprime(T(2)) - @test !isprime(T(4)) -end - -# issue #5210 -@test prod([ k^v for (k,v) in factor(typemax(UInt32)) ]) == typemax(UInt32) -@test prod([ k^v for (k,v) in factor(typemax(Int8)) ]) == typemax(Int8) - # rational-exponent promotion rules (issue #3155): @test 2.0f0^(1//3) == 2.0f0^(1.0f0/3) @test 2^(1//3) == 2^(1/3) -# factorization of factors > 2^16 -@test factor((big(2)^31-1)^2) == Dict(big(2^31-1) => 2) -@test factor((big(2)^31-1)*(big(2)^17-1)) == Dict(big(2^31-1) => 1, big(2^17-1) => 1) - -# fast factorization of Int128 (#11477) -@test factor((Int128(2)^39-7)^2) == Dict(Int128(2)^39-7 => 2) # large shift amounts @test Int32(-1)>>31 == -1 @@ -2615,11 +2444,6 @@ let x = big(-0.0) @test signbit(x) && !signbit(abs(x)) end -# issue #9611 -@test factor(Int128(2)^101+1) == Dict(3=>1,845100400152152934331135470251=>1) - -# test second branch, after all small primes in list have been searched -@test factor(10009 * Int128(1000000000000037)) == Dict(10009=>1,1000000000000037=>1) @test all(x -> (m=mod1(x,3); 0 x == (fld1(x,3)-1)*3 + mod1(x,3), -5:+5)