Sponsoring The Perl Toolchain Summit 2025: Help make this important event another success Learn more

#!/usr/bin/ruby
# Tests for some Number methods.
# Timings:
# 07 March 2023: 2.020s (with MPU)
# 07 March 2023: 2.418s (without MPU)
assert_eq(8 >> 32, 0)
assert_eq(112 >> 32, 0)
assert_eq(208 >> 64, 0)
assert_eq(496 >> 32, 0)
assert_eq(640 >> 32, 0)
assert(!18721.is_carmichael)
assert_eq(5040.remove(2), 315)
assert_eq(5040.neg.remove(2), -315)
assert_eq(5040.neg.remove(-2), -315)
assert_eq(5040.remove(-2), 315)
assert_eq(5040.remove(32), 5040)
assert_eq(5040.remove(24), 210)
assert_eq(5040.remove(29), 5040)
assert_eq(5040.remove(7), 720)
assert_eq(5040.remove(5), 1008)
assert_eq(5040.remove(-5), -1008)
assert_eq(5040.neg.remove(-3), -560)
assert_eq(12!.remove(-3), -1971200)
assert_eq(12!.neg.remove(-3), 1971200)
assert_eq(5040.remove(0), 5040)
assert_eq(5040.remove(1), 5040)
assert_eq(5040.remove(-1), 5040)
assert_eq(1.powerful(-12, 12), 1.powerful(-12, 12))
assert(irand(0, isqrt(2**64 - 1)).is_between(0, 2**32))
assert(irand(0, isqrt(2**128 - 1)).is_between(0, 2**64))
assert_eq(isqrt(2**64 - 1).factor, factor(2**32 - 1))
assert_eq(isqrt(2**128 - 1).factor, factor(2**64 - 1))
assert(43 `divides` 4171)
assert((-43) `divides` 4171)
assert(41 `divides` 4171 -> not)
assert((-41) `divides` 4171 -> not)
assert(4171 `is_div` 43)
assert(4171 `is_div` (-43))
assert(4171 `is_div` 41 -> not)
assert(4171 `is_div` (-41) -> not)
assert((2**128 + 1)*43 `is_div` -43)
assert((2**128 + 1)*43 `is_div` 43)
assert((2**128 + 1)*43 `is_div` -41 -> not)
assert((2**128 + 1)*43 `is_div` 41 -> not)
assert(43 `divides` ((2**128 + 1)*43))
assert((-43) `divides` ((2**128 + 1)*43))
assert(43 `divides` ((2**128 + 1)*41) -> not)
assert((-43) `divides` ((2**128 + 1)*41) -> not)
assert((2**128 + 1) `is_div` 5704689200685129054721)
assert((2**128 + 1) `is_div` (-5704689200685129054721))
assert((2**128 + 1) `is_div` 5704689200685129054723 -> not)
assert(5704689200685129054723 `divides` (2**128 + 1) -> not)
assert(5704689200685129054721 `divides` (2**128 + 1))
assert((-5704689200685129054721) `divides` (2**128 + 1))
assert(42.is_div(6))
assert(!42.is_div(8))
assert(2**32 - 1 -> is_div(2**16 + 1))
assert(2**32 - 1 -> is_div(2**16 + 3) -> not)
assert(2**64 - 1 -> is_div(2**32 + 1))
assert(2**64 - 1 -> is_div(2**32 + 3) -> not)
assert(2**64 - 1 -> is_div(2**32 - 1))
assert(2**128 - 1 -> is_div(2**64 + 1))
assert(2**128 + 1 -> is_div(59649589127497217))
assert(2**128 + 1 -> is_div(59649589127497215) -> not)
assert(2**128 + 1 -> is_div(5704689200685129054721))
assert(2**128 + 1 -> is_div(5704689200685129054723) -> not)
assert_eq(factorial_valuation(3**25 + 1, 2), 847288609427)
assert_eq(factorial_valuation(3**25 - 1, 3), 423644304696)
assert_eq(factorial_valuation(3**25, 127), 6724512769)
assert_eq(factorial_valuation(2**128 + 1, 2**64 + 1), 18446744073709551615)
assert_eq(factorial_valuation(2**128 + 1, 43), 8101961117165201511032728748375433594)
assert_eq(10.by{ .is_div(3) }, [0, 3, 6, 9, 12, 15, 18, 21, 24, 27])
assert_eq({|v| 10.by{ v.is_div(_) } }(20.primorial), 20.primorial.divisors(14))
assert_eq({|v| 10.by{ v.is_div(_) } }(100.primorial), 100.primorial.divisors(14))
assert_eq(10.by{.is_powerful}, 2.powerful(10.nth_powerful))
assert_eq(10.by{.is_powerful(3)}, 3.powerful(10.nth_powerful(3)))
assert(all_prime(5))
assert([2].all_prime)
assert([5].all_prime)
assert([2,3,5,7,11].all_prime)
assert_eq(10.by{.is_safe_prime}, %n[5, 7, 11, 23, 47, 59, 83, 107, 167, 179])
assert_eq(8 >> 8, 0)
assert_eq(0 >> 0, 0)
assert_eq(1234 >> 8, 4)
assert_eq(13.smooth_count(1e16), 511985)
assert_eq(squarefree_sum(1e6), 303961062910)
assert_eq(squarefree_sum(1e7), 30396557311887)
assert_eq(squarefree_count(1e9), 607927124)
assert_eq(squarefree_count(1e10), 6079270942)
assert_eq(prime_count(1e5-1), 9592)
assert_eq(prime_count(1e6-1), 78498)
assert_eq(prime_count(1e5.next_prime-1), 9592)
assert_eq(prime_count(1e6.next_prime-1), 78498)
assert_eq(prime_count(1e5.next_prime), 9593)
assert_eq(prime_count(1e6.next_prime), 78499)
assert_eq(
30.of { .inc.nth_nonpowerfree(1) },
30.by { .is_nonpowerfree(1) }
)
assert_eq(
30.of { .inc.nth_nonpowerfree(2) },
30.by { .is_nonpowerfree(2) }
)
assert_eq(
30.of { .inc.nth_nonpowerfree(3) },
30.by { .is_nonpowerfree(3) }
)
assert_eq(
100.of { .prime_power_sum },
100.of {|n|
sum(1..n.ilog2, {|k|
sum_primes(2, n.iroot(k), k)
})
}
)
assert_eq(
semiprimes(100),
1..100 -> grep { .is_semiprime },
)
assert_eq(
semiprimes(50, 100),
50..100 -> grep { .is_semiprime },
)
assert_eq(
prime_powers(100),
1..100 -> grep { .is_prime_power },
)
assert_eq(
prime_powers(50, 100),
50..100 -> grep { .is_prime_power },
)
# RangeNumber k-almost primes
assert_eq(
gather { 10..100 -> each_almost_prime(2, {|k| take(k) }) },
2.almost_primes(10, 100)
)
assert_eq(
gather { 10..100 -> each_squarefree_almost_prime(2, {|k| take(k) }) },
2.squarefree_almost_primes(10, 100)
)
assert_eq(
gather { 10..100 -> each_almost_prime(3, {|k| take(k) }) },
3.almost_primes(10, 100)
)
assert_eq(
gather { 10..100 -> each_omega_prime(3, {|k| take(k) }) },
3.omega_primes(10, 100)
)
assert_eq(
gather { 10..1e4 -> each_carmichael(3, {|k| take(k) }) },
3.carmichael(10, 1e4)
)
assert_eq(
gather { 10..1e4 -> each_lucas_carmichael(3, {|k| take(k) }) },
3.lucas_carmichael(10, 1e4)
)
assert_eq(
gather { 1e6..1e7 -> each_carmichael(5, {|k| take(k) }) },
5.carmichael(1e6, 1e7)
)
assert_eq(
gather { 1e6..1e7 -> each_lucas_carmichael(5, {|k| take(k) }) },
5.lucas_carmichael(1e6, 1e7)
)
assert_eq(
gather { 10..100 -> each_squarefree_almost_prime(3, {|k| take(k) }) },
3.squarefree_almost_primes(10, 100)
)
assert_eq(
gather { 10..100 `by` 3 -> each_almost_prime(3, {|k| take(k) }) },
10..100 `by` 3 -> grep { .is_almost_prime(3) }
)
assert_eq(
gather { 10..100 `by` 3 -> each_almost_prime(3, {|k| take(k) }) },
10..100 `by` 3 -> grep { .is_almost_prime(3) }
)
assert_eq(
gather { 3..2000 `by` 2 -> each_carmichael(3, {|k| take(k) }) },
3..2000 `by` 2 -> grep { .is_carmichael && .is_almost_prime(3) }
)
assert_eq(
gather { 3..1000 `by` 2 -> each_lucas_carmichael(3, {|k| take(k) }) },
3..1000 `by` 2 -> grep { .is_lucas_carmichael && .is_almost_prime(3) }
)
assert_eq(
gather { 10..200 `by` 3 -> each_squarefree_almost_prime(3, {|k| take(k) }) },
10..200 `by` 3 -> grep { .is_almost_prime(3) && .is_squarefree }
)
assert_eq(
gather { 10..100 `by` 3 -> each_almost_prime(2, {|k| take(k) }) },
10..100 `by` 3 -> grep { .is_almost_prime(2) }
)
# RangeNumber k-powerful numbers
assert_eq(
gather { 10..1000 -> each_powerful(2, {|k| take(k) }) },
2.powerful(10, 1000)
)
assert_eq(
gather { 10..1000 -> each_powerful(3, {|k| take(k) }) },
3.powerful(10, 1000)
)
assert_eq(
gather { 10..1000 `by` 3 -> each_powerful(3, {|k| take(k) }) },
10..1000 `by` 3 -> grep { .is_powerful(3) }
)
assert_eq(
gather { 10..1000 `by` 3 -> each_powerful(2, {|k| take(k) }) },
10..1000 `by` 3 -> grep { .is_powerful(2) }
)
# RangeNumber squarefree numbers
assert_eq(
gather { 10..100 -> each_squarefree {|k| take(k) } },
squarefree(10, 100)
)
assert_eq(
gather { 10..100 `by` 3 -> each_squarefree {|k| take(k) } },
10..100 `by` 3 -> grep { .is_squarefree }
)
# RangeNumber prime numbers
assert_eq(
gather { 10..100 -> each_prime {|k| take(k) } },
primes(10, 100)
)
assert_eq(
gather { 1..100 -> each_prime {|k| take(k) } },
primes(100)
)
assert_eq(
gather { 10..100 `by` 3 -> each_prime {|k| take(k) } },
10..100 `by` 3 -> grep { .is_prime }
)
# RangeNumber composite numbers
assert_eq(
gather { 10..100 -> each_composite {|k| take(k) } },
composites(10, 100)
)
assert_eq(
gather { 1..100 -> each_composite {|k| take(k) } },
composites(100)
)
assert_eq(
gather { 10..100 `by` 3 -> each_composite {|k| take(k) } },
10..100 `by` 3 -> grep { .is_composite }
)
# RangeNumber powerfree numbers
assert_eq(
gather { 10..100 -> each_powerfree(3, {|k| take(k) }) },
3.powerfree(10, 100)
)
assert_eq(
gather { 1..100 -> each_powerfree(2, {|k| take(k) }) },
2.powerfree(100)
)
assert_eq(
gather { 10..100 `by` 3 -> each_powerfree(3, {|k| take(k) }) },
10..100 `by` 3 -> grep { .is_cubefree }
)
# RangeNumber non-powerfree numbers
assert_eq(
gather { 10..100 -> each_nonpowerfree(3, {|k| take(k) }) },
3.nonpowerfree(10, 100)
)
assert_eq(
gather { 1..100 -> each_nonpowerfree(2, {|k| take(k) }) },
2.nonpowerfree(100)
)
assert_eq(
gather { 10..100 `by` 3 -> each_nonpowerfree(3, {|k| take(k) }) },
10..100 `by` 3 -> grep { !.is_cubefree }
)
# RangeNumber semiprime numbers
assert_eq(
gather { 10..100 -> each_semiprime {|k| take(k) } },
semiprimes(10, 100)
)
assert_eq(
gather { 10..100 `by` 3 -> each_semiprime {|k| take(k) } },
10..100 `by` 3 -> grep { .is_semiprime }
)
# RangeNumber prime power numbers
assert_eq(
gather { 50..100 -> each_prime_power {|k| take(k) } },
prime_powers(50, 100)
)
assert_eq(
gather { 10..100 `by` 3 -> each_prime_power {|k| take(k) } },
10..100 `by` 3 -> grep { .is_prime_power }
)
# Counting methods
for k in (1..4) {
var n = irand(50, 100)
assert_eq(k.omega_prime_count(n), 1..n -> count { .is_omega_prime(k) })
assert_eq(k.almost_prime_count(n), 1..n -> count { .is_almost_prime(k) })
assert_eq(k.squarefree_almost_prime_count(n), 1..n -> count { .is_squarefree_almost_prime(k) })
n = irand(100, 1000)
assert_eq(k.omega_prime_count(n), k.omega_primes(n).len)
assert_eq(k.almost_prime_count(n), k.almost_primes(n).len)
assert_eq(k.squarefree_almost_prime_count(n), k.squarefree_almost_primes(n).len)
}
assert_eq(2.powerful(50, 100).len, 2.powerful_count(50, 100))
assert_eq(2.powerful(10, 106).len, 2.powerful_count(10, 106))
assert_eq(2.powerful(50, 106).len, 2.powerful_count(50, 106))
assert_eq(3.powerful(50, 106).len, 3.powerful_count(50, 106))
assert_eq(3.powerful(49, 105).len, 3.powerful_count(49, 105))
assert_eq(
(faulhaber_sum(2**100 * 10000, 1) - 100.nonpowerfree(2**100 * 10000).sum),
100.powerfree_sum(2**100 * 10000)
)
assert_eq(2.nonpowerfree(100), 0..100 -> grep { .is_nonpowerfree(2) })
assert_eq(3.nonpowerfree(100), 0..100 -> grep { .is_nonpowerfree(3) })
assert_eq(4.nonpowerfree(100), 0..100 -> grep { .is_nonpowerfree(4) })
assert_eq(2.nonpowerfree(65, 100, 2), %n[68, 72, 75, 76, 80, 81, 84, 88, 90, 92, 96, 98, 99, 100])
assert_eq(3.nonpowerfree(64, 150, 3), %n[64, 72, 80, 81, 88, 96, 104, 108, 112, 120, 125, 128, 135, 136, 144])
assert_eq(2.nonpowerfree_count(65, 100, 2), 14)
assert_eq(3.nonpowerfree_count(64, 150, 2), 15)
assert_eq(2.nonpowerfree_sum(65, 100, 2), 1199)
assert_eq(3.nonpowerfree_sum(64, 150, 2), 1593)
for k in (2..5) {
var lo = 1e6.irand
var hi = 1e8.irand
assert_eq(k.powerful(lo, hi).sum, k.powerful_sum(lo, hi))
}
assert_eq(10.powerful_sum(1e20), 10.powerful(1e20).sum)
assert_eq(11.powerful_sum(1e20), 11.powerful(1e20).sum)
assert_eq(10.powerful_count(1e20), 10.powerful(1e20).len)
assert_eq(11.powerful_count(1e20), 11.powerful(1e20).len)
# Almost prime divisors
assert_eq(5040.almost_prime_divisors.flat.sort, 5040.divisors)
assert_eq(5040.omega_prime_divisors.flat.sort, 5040.divisors)
do {
var small_k_omega_primes = [
%n[1],
%n[2,3,4,5,7,8,9,11,13,16,17,19,23,25,27,29,31,32,37,41,43,47,49,53,59,61,64,67,71,73,79,81,83,89,97,101,103,107,109,113],
%n[6,10,12,14,15,18,20,21,22,24,26,28,33,34,35,36,38,39,40,44,45,46,48,50,51,52,54,55,56,57,58,62,63,65,68,69,72,74,75,76],
%n[30,42,60,66,70,78,84,90,102,105,110,114,120,126,130,132,138,140,150,154,156,165,168,170,174,180,182,186,190,195,198,204,220,222,228,230,231,234,238,240],
%n[210,330,390,420,462,510,546,570,630,660,690,714,770,780,798,840,858,870,910,924,930,966,990,1020,1050,1092,1110,1122,1140,1155,1170,1190,1218,1230,1254,1260,1290,1302,1320,1326],
%n[2310,2730,3570,3990,4290,4620,4830,5460,5610,6006,6090,6270,6510,6630,6930,7140,7410,7590,7770,7854,7980,8190,8580,8610,8778,8970,9030,9240,9282,9570,9660,9690,9870,10010,10230,10374,10626,10710,10920,11130],
]
small_k_omega_primes.each_kv {|k,v|
assert_eq(k.omega_primes(v[-1]), v)
assert_eq(gather { k.omega_primes_each(v[0], v[-1], { take(_) }) }, v)
}
}
do {
var (x1, x2) = iquadratic_formula(161022, 770228, -1589768114)
assert_eq(x1, 97)
assert_eq(x2, -102)
var tests = [
[6, 11, -35],
[2, -4, -2],
[-4, -7, 12],
[20, -15, -10],
[1, -1, -3],
[-1, 6, 18],
]
for a,b,c in (tests) {
var roots = [quadratic_formula(a,b,c)]
var rootsQ = [quadratic_formulaQ(a,b,c)]
assert_eq(roots.len, 2)
assert_eq(rootsQ.len, 2)
assert(roots.all {|x|
a*x**2 + b*x + c -> round(-30) =~= 0
})
assert(rootsQ.all {|x|
assert_eq(a*x**2 + b*x + c, 0)
})
}
}
do {
var tests = [
[1, -6, 11, -6],
[1, -23, 142, -120],
[5, 2, -5, -3],
[1, 4, 6, 5],
[1, 5, 2, -8],
[1, 4, 7, 6],
[-36, 8, -82, 2850986],
[15, -22, 8, -7520940423059310542039581],
]
for a,b,c,d in (tests) {
var roots = [cubic_formula(a,b,c,d)]
assert_eq(roots.len, 3)
assert(roots.all {|x|
a*x**3 + b*x**2 + c*x + d -> round(-30) =~= 0
})
}
}
do {
var m = (2**16 + 1)
# OEIS: A020500
var x1 = %n[0, 0, 2, 3, 2, 5, 1, 7, 2, 3, 1, 11, 1, 13, 1, 1, 2, 17, 1, 19, 1, 1, 1, 23, 1, 5, 1, 3, 1, 29, 1, 31, 2, 1, 1, 1, 1, 37, 1, 1, 1, 41, 1, 43, 1, 1, 1, 47, 1, 7, 1, 1, 1, 53, 1, 1, 1, 1, 1, 59, 1, 61, 1, 1, 2, 1, 1, 67, 1, 1, 1, 71, 1, 73, 1, 1, 1, 1, 1, 79, 1, 3, 1, 83, 1, 1, 1, 1, 1, 89, 1, 1, 1, 1, 1, 1, 1, 97, 1, 1]
# OEIS: A020513
var xn1 = %n[0, -2, 0, 1, 2, 1, 3, 1, 2, 1, 5, 1, 1, 1, 7, 1, 2, 1, 3, 1, 1, 1, 11, 1, 1, 1, 13, 1, 1, 1, 1, 1, 2, 1, 17, 1, 1, 1, 19, 1, 1, 1, 1, 1, 1, 1, 23, 1, 1, 1, 5, 1, 1, 1, 3, 1, 1, 1, 29, 1, 1, 1, 31, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 1, 1, 1, 1, 41, 1, 1, 1, 43, 1, 1, 1, 1, 1, 1, 1, 47, 1, 1, 1, 7, 1]
assert_eq(100.of {|n| cyclotomic(n, 1) }, x1)
assert_eq(100.of {|n| cyclotomicmod(n, 1, 29) }, x1.map{_ % 29})
assert_eq(100.of {|n| cyclotomic(n, -1) }, xn1)
assert_eq(100.of {|n| cyclotomicmod(n, -1, 29) }, xn1.map {_ % 29})
for n in (-1 .. 10), x in (-10 .. 10) {
assert_eq(Str(cyclotomic(n, x) % m), Str(cyclotomicmod(n, x, m)))
}
assert_eq(cyclotomicmod(2**127 - 1, 2, 2**127 - 1), 1)
assert_eq(cyclotomicmod(2**127 - 1, 2*3*5, 2**127 - 1), 1)
assert_eq(cyclotomicmod(2**127 - 1, 2**127 - 1, 2**127 - 1), 1)
assert_eq(cyclotomicmod(2**64 + 1, 5040, 503*863), 287421)
assert_eq(cyclotomicmod(2**64 + 1, -5040, 503*863), cyclotomicmod(2**64 + 1, (-5040)%(503*863), 503*863))
assert_eq(cyclotomicmod(7!, 5040, 2**128 + 1), 235744758223530422383203401596174491694)
assert_eq(cyclotomicmod(30!, 5040, 2**128 + 1), 40675970320518606495224484019728682382)
assert_eq(cyclotomicmod(2**128 - 1, 5040, 2**128 + 1), 258216496104743231120502200247009922076)
assert_eq(cyclotomicmod(5040*5704689200685129054721, 2**256 + 1, 2**64 + 1), 1)
assert_eq(cyclotomicmod(5040*5704689200685129054721, next_prime(2**64), prev_prime(2**64)), 385968771661381427)
}
do {
assert(%n[294409, 167979421, 1152091655881, 62411762908817281, 1516087654274358001].all{.is_imprimitive_carmichael})
assert(42310088783100741554666880481.is_imprimitive_carmichael)
assert(21593590390253023722267234622513201.is_imprimitive_carmichael)
assert(16412975107923138847512341751620644377601.is_imprimitive_carmichael)
assert(325533792014488126487416882038879701391121.is_imprimitive_carmichael)
assert(1605045791181700950034233564955898780122791301414374937801.is_imprimitive_carmichael)
}
do {
with (%n[341, 294409, 9972894583, 1264022137981459, 14054662152215842621]) {|a|
assert(a.all {.is_super_psp})
assert(a.none{.is_over_psp})
}
assert(192463418472849397730107809253922101.is_super_psp)
assert(1347320741392600160214289343906212762456021.is_super_psp)
assert(70865138168006643427403953978871929070133095474701.is_super_psp)
assert(3363391752747838578311772729701478698952546288306688208857.is_super_psp)
assert(132153369641266990823936945628293401491197666138621036175881960329.is_super_psp)
assert(9105096650335639994239038954861714246150666715328403635257215036295306537.is_super_psp)
}
do {
for n in (%n[2047, 13421773, 14073748835533, 1376414970248942474729, 48663264978548104646392577273, 294413417279041274238472403168164964689, 98117433931341406381352476618801951316878459720486433149, 1252977736815195675988249271013258909221812482895905512953752551821]) {
assert(n.is_psp)
assert(n.is_over_psp)
assert(n.is_strong_psp)
assert(n.is_super_psp)
assert(n.is_euler_psp)
assert(!n.is_pell_psp)
assert(!n.is_bfw_psp)
assert(!n.is_bpsw_prp)
assert(!n.is_fib_psp)
assert(!n.is_carmichael)
assert(!n.is_chebyshev_psp)
assert(!n.is_strong_fib_psp)
assert(!n.is_lucas_psp)
assert(!n.is_lucasU_psp(1, -1))
assert(!n.is_lucasV_psp(1, -1))
assert(!n.is_lucasU_psp)
assert(!n.is_lucasV_psp)
assert(!n.is_strong_lucas_psp)
assert(!n.is_stronger_lucas_psp)
assert(!n.is_strongish_lucas_psp)
assert(!n.is_lucas_carmichael)
assert(!n.is_imprimitive_carmichael)
}
}
do {
assert_eq(20.of {.lnsuperprimorial} ~Z=~= 20.of{.superprimorial.ln} -> uniq, [true])
assert_eq(20.of {.lnsuperfactorial} ~Z=~= 20.of{.superfactorial.ln} -> uniq, [true])
assert_eq(20.of {.lnhyperfactorial} ~Z=~= 20.of{.hyperfactorial.ln} -> uniq, [true])
}
do {
var p = (2**127 - 1)
var t = nil
for k in (-100 .. 100) {
if (1.rand < 0.3) {
t = next_prime_power(p+k)
assert(t.is_prime_power)
assert(t > p+k)
t = prev_prime_power(p+k)
assert(t.is_prime_power)
assert(t < p+k)
}
if (1.rand < 0.05) {
t = next_perfect_power(p+k)
assert(t.is_perfect_power)
assert(t > p+k)
t = prev_perfect_power(p+k)
assert(t.is_perfect_power)
assert(t < p+k)
}
}
}
do {
var p = 4171
var t = nil
for k in (-100 .. 100) {
if (1.rand < 0.3) {
t = next_prime_power(p+k)
assert(t.is_prime_power)
assert(t > p+k)
t = prev_prime_power(p+k)
assert(t.is_prime_power)
assert(t < p+k)
}
if (1.rand < 0.1) {
t = next_perfect_power(p+k)
assert(t.is_perfect_power)
assert(t > p+k)
t = prev_perfect_power(p+k)
assert(t.is_perfect_power)
assert(t < p+k)
}
}
}
do {
var n = 0
var arr = []
20.of {
arr << (n = next_prime_power(n))
}
assert_eq(arr, {.is_prime_power}.first(20))
}
assert_eq(prime_count(619, 619), 1)
assert_eq(prime_count(620, 620), 0)
assert_eq(prime_count(620, 621), 0)
assert_eq(prime_count(619, 621), 1)
assert_eq(prime_count(620, 621), 0)
assert_eq(prime_count(620, 630), 0)
assert_eq(prime_count(620, 631), 1)
assert_eq(prime_count(619, 631), 2)
assert_eq(prime_power_sum(626, 630), prime_powers(626, 630).sum)
assert_eq(prime_power_sum(620, 630), prime_powers(620, 630).sum)
assert_eq(prime_power_sum(620, 631), prime_powers(620, 631).sum)
assert_eq(prime_power_sum(619, 631), prime_powers(619, 631).sum)
assert_eq(prime_power_sum(43**2), prime_powers(43**2).sum)
assert_eq(prime_power_sum(43**3), prime_powers(43**3).sum)
assert_eq(prime_count(2**127 - 1, 2**127 - 1), 1)
assert_eq(3.almost_prime_count(82654, 7158821), 1736362)
assert_eq(4.almost_prime_count(83925, 4376019), 872251)
assert_eq(omega_prime_count(15, 880788066951082290), 10)
assert_eq(omega_prime_count(15, 1922334673882737115), 365)
with (14.omega_primes(20483443417467030)) {|a|
assert_eq(a.last, 20483443417467030)
assert_eq(a.len, 15)
}
with (15.omega_primes(1922334673882737115)) {|a|
assert_eq(a.last, 1920731913647276730)
assert_eq(a.len, 365)
}
assert_eq(next_squarefree(2**31 + 3), 2**31 + 6)
assert_eq(next_squarefree(2**128 + 1), 2**128 + 2)
assert_eq(prev_squarefree(2**31 + 3), 2**31 + 1)
assert_eq(prev_squarefree(2**128 + 3), 2**128 + 2)
assert_eq(next_powerfree(2**31 + 3, 3), 2**31 + 4)
assert_eq(next_powerfree(2**128 + 1, 3), 2**128 + 2)
assert_eq(prev_powerfree(2**31 + 3, 3), 2**31 + 2)
assert_eq(prev_powerfree(2**128 + 3, 3), 2**128 + 2)
assert_eq(next_semiprime(23), 25)
assert_eq(next_semiprime(4171), 4174)
assert_eq(next_semiprime(4171-1), 4171)
assert_eq(next_semiprime(2**128 + 1), 2**128 + 3)
assert_eq(next_squarefree_semiprime(23), 26)
assert_eq(next_squarefree_semiprime(4171), 4174)
assert_eq(next_squarefree_semiprime(4171-1), 4171)
assert_eq(next_squarefree_semiprime(2**128 + 1), 2**128 + 3)
assert_eq(prev_semiprime(4171), 4169)
assert_eq(prev_semiprime(4171+1), 4171)
assert_eq(prev_semiprime(2**128 + 1), 2**128 - 2)
assert_eq(prev_almost_prime(2**128 + 1, 3), 2**128 - 3)
assert_eq(prev_almost_prime(2**128 + 1, 125), 2**128 - 2**122)
assert_eq(next_almost_prime(2**128 + 1, 126), (75*128**18 + 120*128**17)/15)
#assert_eq(next_omega_prime(16.pn_primorial, 16), 36278497172720993190) # quite slow
for k in (1..3) {
var n = 30
if (k > 1) {
assert_eq(
n.inc.of { .next_powerfree(k).prev_powerfree(k) }.grep.uniq,
k.powerfree(n),
)
}
assert_eq(
n.inc.of { .next_powerful(k).prev_powerful(k) }.grep.uniq,
k.powerful(n),
)
assert_eq(
n.inc.of { .next_nonpowerfree(k).prev_nonpowerfree(k) }.grep.uniq,
k.nonpowerfree(n),
)
assert_eq(
n.inc.of { .next_almost_prime(k).prev_almost_prime(k) }.grep.uniq,
k.almost_primes(n),
)
assert_eq(
n.inc.of { .next_squarefree_almost_prime(k).prev_squarefree_almost_prime(k) }.grep.uniq,
k.squarefree_almost_primes(n),
)
assert_eq(
n.inc.of { .next_omega_prime(k).prev_omega_prime(k) }.grep.uniq,
k.omega_primes(n),
)
}
assert_eq(next_omega_prime(8.pn_primorial*17, 8), 164949330)
assert_eq(prev_omega_prime(8.pn_primorial*17, 8), 164862390)
assert_eq(next_omega_prime(1e8, 8), 100025310)
assert_eq(prev_omega_prime(1e8, 8), 99981420)
assert_eq(next_squarefree_almost_prime(8.pn_primorial/13 * 23, 8), 17687670)
assert_eq(prev_squarefree_almost_prime(8.pn_primorial/13 * 23, 8), 16546530)
assert_eq(next_squarefree_almost_prime(1e8, 8), 100025310)
assert_eq(prev_squarefree_almost_prime(1e8, 8), 99953490)
var seen = Set()
for n,k in ([[4171, 1], [4171, 2], [4171, 3], [1e4, 4], [1e8, 7], [1e8,6], [1e8,5], [1e12,7], [1e12,6], [1e12,5]]) {
if (n <= 1e6) {
assert_eq(prev_almost_prime(next_almost_prime(n, k), k), prev_almost_prime(n+1, k))
assert_eq(next_almost_prime(prev_almost_prime(n, k), k), next_almost_prime(n-1, k))
assert_eq(prev_squarefree_almost_prime(next_squarefree_almost_prime(n, k), k), prev_squarefree_almost_prime(n+1, k))
assert_eq(next_squarefree_almost_prime(prev_squarefree_almost_prime(n, k), k), next_squarefree_almost_prime(n-1, k))
assert_eq(prev_omega_prime(next_omega_prime(n, k), k), prev_omega_prime(n+1, k))
assert_eq(next_omega_prime(prev_omega_prime(n, k), k), next_omega_prime(n-1, k))
}
if (!seen.has(n)) { # methods that take only one argument (n)
seen << n
assert_eq(next_semiprime(n), ->(n) {
++n; while (!n.is_semiprime) { ++n }; n
}(n))
assert_eq(prev_semiprime(n), ->(n) {
--n; while (!n.is_semiprime) { --n }; n
}(n))
assert_eq(next_squarefree_semiprime(n), ->(n) {
++n; while (!n.is_squarefree_semiprime) { ++n }; n
}(n))
assert_eq(prev_squarefree_semiprime(n), ->(n) {
--n; while (!n.is_squarefree_semiprime) { --n }; n
}(n))
assert_eq(next_squarefree(n), ->(n) {
++n; while (!n.is_squarefree) { ++n }; n
}(n))
assert_eq(prev_squarefree(n), ->(n) {
--n; while (!n.is_squarefree) { --n }; n
}(n))
assert_eq(next_prime(n), ->(n) {
++n; while (!n.is_prime) { ++n }; n
}(n))
assert_eq(prev_prime(n), ->(n) {
--n; while (!n.is_prime) { --n }; n
}(n))
assert_eq(next_prime_power(n), ->(n) {
++n; while (!n.is_prime_power) { ++n }; n
}(n))
assert_eq(prev_prime_power(n), ->(n) {
--n; while (!n.is_prime_power) { --n }; n
}(n))
}
if (n <= 1e6) {
with (next_omega_prime(n,k)) {|w|
assert_eq([w], k.omega_primes(n+1, w))
}
with (prev_omega_prime(n,k)) {|w|
assert_eq([w], k.omega_primes(w, n-1))
}
with (next_squarefree_almost_prime(n,k)) {|w|
assert_eq([w], k.squarefree_almost_primes(n+1, w))
}
with (prev_squarefree_almost_prime(n,k)) {|w|
assert_eq([w], k.squarefree_almost_primes(w, n-1))
}
}
with (next_almost_prime(n,k)) {|w|
assert_eq([w], k.almost_primes(n+1, w))
}
with (prev_almost_prime(n,k)) {|w|
assert_eq([w], k.almost_primes(w, n-1))
}
assert_eq(next_omega_prime(n,k), ->(n) {
++n; while (!n.is_omega_prime(k)) { ++n }; n
}(n))
assert_eq(prev_omega_prime(n,k), ->(n) {
--n; while (!n.is_omega_prime(k)) { --n }; n
}(n))
assert_eq(next_almost_prime(n,k), ->(n) {
++n; while (!n.is_almost_prime(k)) { ++n }; n
}(n))
assert_eq(prev_almost_prime(n,k), ->(n) {
--n; while (!n.is_almost_prime(k)) { --n }; n
}(n))
assert_eq(next_squarefree_almost_prime(n,k), ->(n) {
++n; while (!n.is_squarefree_almost_prime(k)) { ++n }; n
}(n))
assert_eq(prev_squarefree_almost_prime(n,k), ->(n) {
--n; while (!n.is_squarefree_almost_prime(k)) { --n }; n
}(n))
if (k > 1) {
assert_eq(next_powerfree(n,k), ->(n) {
++n; while (!n.is_powerfree(k)) { ++n }; n
}(n))
assert_eq(prev_powerfree(n,k), ->(n) {
--n; while (!n.is_powerfree(k)) { --n }; n
}(n))
with (next_powerfree(n,k)) {|w|
assert_eq([w], k.powerfree(n+1, w))
}
with (prev_powerfree(n,k)) {|w|
assert_eq([w], k.powerfree(w, n-1))
}
}
if (n <= 1e6) {
assert_eq(next_powerful(n,k), ->(n) {
++n; while (!n.is_powerful(k)) { ++n }; n
}(n))
assert_eq(prev_powerful(n,k), ->(n) {
--n; while (!n.is_powerful(k)) { --n }; n
}(n))
assert_eq(next_nonpowerfree(n,k), ->(n) {
++n; while (!n.is_nonpowerfree(k)) { ++n }; n
}(n))
assert_eq(prev_nonpowerfree(n,k), ->(n) {
--n; while (!n.is_nonpowerfree(k)) { --n }; n
}(n))
}
with (next_powerful(n,k)) {|w|
assert_eq([w], k.powerful(n+1, w))
}
with (prev_powerful(n,k)) {|w|
assert_eq([w], k.powerful(w, n-1))
}
with (next_nonpowerfree(n,k)) {|w|
assert_eq([w], k.nonpowerfree(n+1, w))
}
with (prev_nonpowerfree(n,k)) {|w|
assert_eq([w], k.nonpowerfree(w, n-1))
}
}
assert_eq(next_perfect_power(4171), do {
var n = 4171; while (!n.is_perfect_power) { ++n }; n
})
assert_eq(prev_perfect_power(4171), do {
var n = 4171; while (!n.is_perfect_power) { --n }; n
})
assert_eq(
next_perfect_power(1<<3320).prev_perfect_power.prev_perfect_power.next_perfect_power,
1 << 3320,
)
assert_eq(
10.by { .is_squarefree_almost_prime(2) },
10.of { .inc.nth_squarefree_almost_prime(2) },
)
assert_eq(
10.by { .is_squarefree_almost_prime(3) },
10.of { .inc.nth_squarefree_almost_prime(3) },
)
assert(is_squarefree_almost_prime(2**64 + 1, 2))
assert(!is_squarefree_almost_prime(2**64 + 1, 3))
assert(is_squarefree_almost_prime((2**64 + 1) * 2, 3))
assert(!is_squarefree_almost_prime((2**64 + 1) * 4, 3))
assert(is_squarefree_almost_prime((2**64 + 1) * 503 * 863, 4))
assert(is_squarefree_almost_prime((2**64 + 1) * 503 * 863 * 1000000007, 5))
assert(!is_squarefree_almost_prime((2**64 + 1) * 503 * 863 * 1000000007**2, 5))
assert(!is_squarefree_almost_prime((2**64 + 1) * 503 * 863 * 1000000007**2, 6))
assert(30.by { .is_cyclic }, 30.by { .is_coprime(.phi) })
assert(8177568910636879136524885826320973235.is_cyclic)
assert(17277031840122951876810012573270045985.is_cyclic)
assert(2059832906607460252767290568443059994787898033540634712711845135488141590979778401392385.is_cyclic)
assert(2050222770372550554323267720953963601363820698627252818938445687085323309254089582862054255135745.is_cyclic)
with (29830753961909190919091909190919091909187936016513) {|n|
for k in (nil, 0, 1) {
var f = n.special_factor(k)
assert(f.len >= 2)
assert_eq(f.prod, n)
}
}
assert(!is_cyclic(5040))
assert(!is_cyclic(2**256 - 1))
assert(!is_cyclic(2**256 - 11))
assert(!is_cyclic(100!))
# OEIS: A376332
assert(1..12 -> map {|k| 489118019 - k! }.all{.is_semiprime})
assert(1..13 -> map {|k| 6233987183 - k! }.all{.is_semiprime})
assert(1..14 -> map {|k| 87199150463 - k! }.all{.is_semiprime})
assert(1..15 -> map {|k| 1310334397523 - k! }.all{.is_semiprime})
assert(1..16 -> map {|k| 20937254735843 - k! }.all{.is_semiprime})
assert(1..17 -> map {|k| 355693511854763 - k! }.all{.is_semiprime})
assert(33110689978317405605970.phi.is_power(14))
assert(1262838284613442604484690.phi.is_power(15))
assert_eq(sum_primes(1e6), 37550402023)
assert_eq(sum_primes(1, 1e6, 2), 24693298341834533)
assert_eq(sum_primes(2, 1e6, 3), 18393235410255348281725)
assert_eq(sum_primes(1e5, 1e6, 4), 14652141801059963090664358346)
assert_eq(sum_primes(1e4, 1e6, 5), 12174298052688955639420343987695627)
assert_eq(
30.of { sum_primes(_) }
30.of { .primes.sum }
)
assert_eq(
30.of { sum_primes(1, _, 2) }
30.of { .primes.sum{.sqr} }
)
assert_eq(
30.of { sum_primes(1, _, 0) }
30.of { .prime_count }
)
assert_eq(sum_primes(1e8-1000, 1e8, 1), primes(1e8-1000, 1e8).sum)
assert_eq(sum_primes(1e8-1000, 1e8, 2), primes(1e8-1000, 1e8).sum{.sqr})
assert_eq(sum_primes(1e8-1000, 1e8, 3), primes(1e8-1000, 1e8).sum{.ipow(3)})
assert_eq(prev_composite(2**127 + 2), 2**127 + 1)
assert_eq(prev_composite(2**127 + 1), 2**127)
assert_eq(prev_composite(2**127), 2**127 - 2)
assert_eq(prime_count(2**65, 2**65 + 10000), 229)
assert_eq(prime_power_count(2**65, 2**65 + 10000), 230)
assert_eq(
10.by { .diff_of_squares.len == 3 },
%n[45, 48, 63, 64, 72, 75, 80, 81, 99, 112]
)
assert_eq(
diff_of_squares(2**64 + 3),
[%n[19965236662, 19497792975], %n[9223372036854775810, 9223372036854775809]]
)
assert_eq(
10.by { .sum_of_squares.len == 3 },
%n[325, 425, 625, 650, 725, 845, 850, 925, 1025, 1250]
)
assert_eq(
sum_of_squares(2**64 + 9),
[%n[3, 4294967296], %n[1202590840, 4123168605], %n[1511828491, 4020089388], %n[2576980380, 3435973835]],
)
assert_eq(primitive_part(423, 2), 1)
assert_eq(primitive_part(13, 5040), 13)
assert_eq(
20.of { .primitive_part(_) },
%n[1, 1, 2, 3, 2, 5, 1, 7, 2, 3, 1, 11, 1, 13, 1, 1, 2, 17, 1, 19]
)
assert_eq(
15.of { primitive_part(_+1, { .fib }) },
%n[1, 1, 2, 3, 5, 4, 13, 7, 17, 11, 89, 6, 233, 29, 61]
)
assert_eq(
22.of { primitive_part(_+1, { .factorial }) },
%n[1, 2, 6, 12, 120, 60, 5040, 1680, 60480, 15120, 39916800, 55440, 6227020800, 8648640, 1816214400, 518918400, 355687428096000, 147026880, 121645100408832000, 55870214400, 1689515283456000, 14079294028800]
)
assert_eq(
%n[1,2,3,4,5,6,7].nth_permutation(10),
%n[1, 2, 3, 5, 7, 4, 6],
)
assert_eq(
%n[1,2,3,4,5,6,7].nth_permutation(100),
%n[1, 2, 7, 3, 6, 4, 5],
)
assert_eq(18446744073709551606 - (-100),18446744073709551706)
assert_eq((-100) - 18446744073709551606, -18446744073709551706)
assert_eq(100 - 18446744073709551606, -18446744073709551506)
assert_eq(99761490592 * -99761490592, -9952355005137704510464)
assert_eq(-99761490592 * 99761490592, -9952355005137704510464)
assert_eq(-99761490592 * -99761490592, 9952355005137704510464)
for k in (2..100, 200..210, 1234..1254, 9000..9010, 30_000..30_010, 100_000..100_010) {
assert_eq(20.of { .pyramidal(k) }.grep { !.is_pyramidal(k) }, [])
assert_eq(20.of { 1e6.irand.pyramidal(k) }.grep { !.is_pyramidal(k) }, [])
assert_eq(20.of { .polygonal(k) }.grep { !.is_polygonal(k) }, [])
assert_eq(20.of { 1e6.irand.polygonal(k) }.grep { !.is_polygonal(k) }, [])
assert_eq(20.of { .centered_polygonal(k) }.grep { !.is_centered_polygonal(k) }, [])
assert_eq(20.of { 1e6.irand.centered_polygonal(k) }.grep { !.is_centered_polygonal(k) }, [])
}
with (%n[20, 140, 405, 2856, 25296, 111720, 25984, 5474000, 237600, 223826688, 3852800, 268565760, 1834725376, 175861400000, 335674368, 2863363937280, 4383831556096, 206015846400, 3400704000, 938209120583680, 2981338216980480, 21463949229465600, 45410367307776, 72056803765911552]) {|arr|
assert_eq(
arr.map_kv {|k,v|
var t = v.pyramidal_root(k+3).round(-40)
assert(t.is_int)
pyramidal(t, k+3)
},
arr
)
}
with (%n[1, 4, 10, 460, 9010, 772210, 20120860, 1553569960, 85507715710, 14932196985010, 1033664429333260, 197628216951078460, 21266854897681220860, 7423007155473283614010, 3108276166302017120182510, 851452464506763307285599610, 32749388246772812069108696710]) {|arr|
assert_eq(
arr.map {|v|
var t = v.centered_polygonal_root(3)
assert(t.is_int)
centered_polygonal(t, 3)
},
arr
)
}
with (%n[64, 925, 2976, 93457, 866272, 11025, 3036880, 18412718645101, 9283470627432, 201580440699781, 92839099743040, 5236660451226975, 66779973961058176]) {|arr|
assert_eq(
arr.map_kv {|k,v|
var t = v.centered_polygonal_root(k+3)
assert(t.is_int)
centered_polygonal(t, k+3)
},
arr
)
}
with (%n[28, 16, 176, 4950, 8910, 1408, 346500, 277992, 7542080, 326656, 544320, 120400000, 145213440, 48549888, 4733575168, 536813568, 2149576704, 3057500160, 938539560960, 1358951178240, 36324805836800, 99956555776, 49212503949312, 118747221196800, 59461613912064, 13749193801728, 7526849672380416, 98516240758210560, 4969489493917696, 78673429816934400, 4467570822566903808, 1013309912383488000]) {|arr|
assert_eq(
arr.map_kv {|k,v|
var t = v.polygonal_root(k+3)
assert(t.is_int)
polygonal(t, k+3)
},
arr
)
}
for name,f,g in ([
[:pyramidal, Num.method(:pyramidal_root), Num.method(:pyramidal)],
[:polygonal, Num.method(:polygonal_root), Num.method(:polygonal)]
[:central, Num.method(:centered_polygonal_root), Num.method(:centered_polygonal)]
]) {
30.times {
for n in (1e8.irand, 1e30.irand) {
var k = irand(3, 100)
var r = f(n, k)
assert((g(r.floor, k) <= n) && (g(r.ceil, k) >= n), "[#{name}] Testing: #{n} #{k}")
}
}
}
assert_eq(
20.of { .phi },
%n[0, 1, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16, 6, 18]
)
assert_eq(
20.of { .lambda },
%n[0, 1, 1, 2, 2, 4, 2, 6, 2, 6, 4, 10, 2, 12, 6, 4, 4, 16, 6, 18]
)
assert_eq(
20.of { .liouville },
%n[0, 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, 1, 1, -1, -1, -1]
)
assert_eq(
20.of { .moebius },
20.of { .is_squarefree ? ((-1)**.omega) : 0 }
)
assert_eq(
30.of { .bell },
%n[1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975, 678570, 4213597, 27644437, 190899322, 1382958545, 10480142147, 82864869804, 682076806159, 5832742205057, 51724158235372, 474869816156751, 4506715738447323, 44152005855084346, 445958869294805289, 4638590332229999353, 49631246523618756274, 545717047936059989389, 6160539404599934652455, 71339801938860275191172],
)
assert_eq(
30.of { .bellmod(4171) },
%n[1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975, 678570, 4213597, 27644437, 190899322, 1382958545, 10480142147, 82864869804, 682076806159, 5832742205057, 51724158235372, 474869816156751, 4506715738447323, 44152005855084346, 445958869294805289, 4638590332229999353, 49631246523618756274, 545717047936059989389, 6160539404599934652455, 71339801938860275191172].map { .mod(4171) },
)
assert_eq(
20.by { .is_composite },
20.by { !.is_prime && _>=4 }
)
assert_eq(
20.by { .is_squarefree },
20.by { .moebius != 0 }
)
assert_eq(lpf(2**64 + 1), 274177)
assert_eq(gpf(2**64 + 1), 67280421310721)
assert_eq(10.of { .catalan }, %n[1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862])
assert_eq(10.of { euler_number(_) }, %n[1, 0, -1, 0, 5, 0, -61, 0, 1385, 0])
assert_eq(10.of { euler_number(2*_) }, %n[1, -1, 5, -61, 1385, -50521, 2702765, -199360981, 19391512145, -2404879675441])
assert_eq(15.of { .lucas }, %n[2, 1, 3, 4, 7, 11, 18, 29, 47, 76, 123, 199, 322, 521, 843])
assert_eq(15.of { .fibonacci(2) }, %n[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377])
assert_eq(15.of { .fibonacci(3) }, %n[0, 0, 1, 1, 2, 4, 7, 13, 24, 44, 81, 149, 274, 504, 927])
assert_eq(15.of { .fibonacci(4) }, %n[0, 0, 0, 1, 1, 2, 4, 8, 15, 29, 56, 108, 208, 401, 773])
assert_eq(1e5.fib(2), Math.linear_rec(2.of(1), 1.of(0)+[1], 1e5))
assert_eq(1e5.fib(3), Math.linear_rec(3.of(1), 2.of(0)+[1], 1e5))
assert_eq(1e5.fib(4), Math.linear_rec(4.of(1), 3.of(0)+[1], 1e5))
assert_eq(15.of {|n| n! }, %n[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200])
assert_eq(15.of {|n| n!! }, %n[1, 1, 2, 3, 8, 15, 48, 105, 384, 945, 3840, 10395, 46080, 135135, 645120])
assert_eq(15.of {|n| n.multi_factorial(3) }, %n[1, 1, 2, 3, 4, 10, 18, 28, 80, 162, 280, 880, 1944, 3640, 12320])
assert_eq(15.of {|n| n.subfactorial }, %n[1, 0, 1, 2, 9, 44, 265, 1854, 14833, 133496, 1334961, 14684570, 176214841, 2290792932, 32071101049])
assert_eq(prime_sum(50, 100, 2), primes(50, 100).sum { _**2 })
assert_eq(composite_sum(50, 100, 2), composites(50, 100).sum { _**2 })
assert_eq(composite_sum(100, 97), 0)
assert_eq(composite_sum(100, 97), 0)
assert_eq(composite_sum(93, 93), 93)
assert_eq(composite_sum(1e2, 1e3), composites(1e2, 1e3).sum)
assert_eq(composite_sum(1e2.prev_prime, 1e3), composites(1e2.prev_prime, 1e3).sum)
assert_eq(composite_sum(1e2, 1e3.next_prime), composites(1e2, 1e3.next_prime).sum)
assert_eq(composite_sum(1e2.next_prime, 1e3.next_prime), composites(1e2.next_prime, 1e3.next_prime).sum)
assert_eq(20.by { .is_squarefree }, squarefree(20.nth_squarefree))
assert_eq(20.by { .is_cubefree }, 1..20.nth_cubefree -> grep { .is_powerfree(3) })
assert_eq(20.by { .is_nonsquarefree }, nonsquarefree(20.nth_nonsquarefree))
assert_eq(20.by { .is_noncubefree }, 1..20.nth_noncubefree -> grep { .is_nonpowerfree(3) })
assert_eq(20.by { .is_squarefull }, 2.powerful(20.nth_powerful(2)))
assert_eq(20.by { .is_cubefull }, 3.powerful(20.nth_powerful(3)))
assert_eq(1000!.lpf, 2)
assert_eq(1000!.make_coprime(2*3*5*7).lpf, 11)
assert_eq(1000!.gpf, 1000.prev_prime)
assert_eq(gpf(1000! * (2**64 + 1)), 67280421310721)
assert_eq(20.of{ .nonsquarefree_count }, 20.of{ .is_nonsquarefree ? 1 : 0 }.acc)
assert_eq(20.of{ .nonsquarefree_sum }, 20.of{ .is_nonsquarefree ? _ : 0 }.acc)
assert_eq(20.of{ .noncubefree_count }, 20.of{ .is_noncubefree ? 1 : 0 }.acc)
assert_eq(20.of{ .noncubefree_sum }, 20.of{ .is_noncubefree ? _ : 0 }.acc)
assert_eq(20.of{ 4.nonpowerfree_count(_) }, 20.of{ .is_nonpowerfree(4) ? 1 : 0 }.acc)
assert_eq(20.of{ 4.nonpowerfree_sum(_) }, 20.of{ .is_nonpowerfree(4) ? _ : 0 }.acc)
assert_eq(20.of{ 4.powerfree_count(_) }, 20.of{ .is_powerfree(4) ? 1 : 0 }.acc)
assert_eq(20.of{ 4.powerfree_sum(_) }, 20.of{ .is_powerfree(4) ? _ : 0 }.acc)
assert_eq(20.of { .squarefree_count }, 20.of { .is_squarefree ? 1 : 0 }.acc)
assert_eq(20.of { .squarefree_sum }, 20.of { .is_squarefree ? _ : 0 }.acc)
assert_eq(20.of { .cubefree_count }, 20.of { .is_cubefree ? 1 : 0 }.acc)
assert_eq(20.of { .cubefree_sum }, 20.of { .is_cubefree ? _ : 0 }.acc)
assert_eq(20.of { .squarefull_count }, 20.of { .is_squarefull ? 1 : 0 }.acc)
assert_eq(20.of { .squarefull_sum }, 20.of { .is_squarefull ? _ : 0 }.acc)
assert_eq(20.of { .cubefull_count }, 20.of { .is_cubefull ? 1 : 0 }.acc)
assert_eq(20.of { .cubefull_sum }, 20.of { .is_cubefull ? _ : 0 }.acc)
assert_eq(20.of { .composite_count }, 20.of { .is_composite ? 1 : 0 }.acc)
assert_eq(20.of { .composite_sum }, 20.of { .is_composite ? _ : 0 }.acc)
assert_eq(20.of { .mertens }, 20.of { .moebius }.acc)
assert_eq(20.of { .liouville }, 20.of { .is_zero ? 0 : ((-1)**bigomega(_)) })
assert_eq(20.of { .liouville_sum }, 20.of { .liouville }.acc)
assert_eq(20.of { 2.power_count(_) }, 20.of { .is_power(2)&&.is_pos ? 1 : 0 }.acc)
assert_eq(20.of { 3.power_count(_) }, 20.of { .is_power(3)&&.is_pos ? 1 : 0 }.acc)
assert_eq(20.of { 2.power_sum(_) }, 20.of { .is_power(2) ? _ : 0 }.acc)
assert_eq(20.of { 3.power_sum(_) }, 20.of { .is_power(3) ? _ : 0 }.acc)
assert_eq(20.of { .pi }, 20.of { .is_prime ? 1 : 0 }.acc)
assert_eq(20.of { .prime_sum }, 20.of { .is_prime ? _ : 0 }.acc)
assert_eq(20.of { prime_sum(2,_,0) }, 20.of { .is_prime ? 1 : 0 }.acc)
assert_eq(20.of { prime_sum(0,_) }, 20.of { .is_prime ? _ : 0 }.acc)
assert_eq(20.of { .prime_sum(nil,2) }, 20.of { .is_prime ? .sqr : 0 }.acc)
assert_eq(20.of { prime_sum(2,_,3) }, 20.of { .is_prime ? .cube : 0 }.acc)
assert_eq(20.of { prime_sum(3,_,3) }, 20.of { (.is_prime && _>=3) ? .cube : 0 }.acc)
assert_eq(20.of { .primorial }, 20.of { .is_prime ? _ : 1 }.map_reduce{|a,b| a*b })
assert_eq(20.of { .pn_primorial }, 20.of { .nth_prime }.map_reduce{|a,b| a*b })
assert_eq(20.of { .lpf_sum }, 20.of { _ >= 2 ? .lpf : 0 }.acc)
assert_eq(20.of { .gpf_sum }, 20.of { _ >= 2 ? .gpf : 0 }.acc)
assert_eq(20.of { .sigma0 }, 20.of { .divisors.len })
assert_eq(20.of { .sigma(0) }, 20.of { .divisors.len })
assert_eq(20.of { .sigma }, 20.of { .divisors.sum })
assert_eq(20.of { .sigma(2) }, 20.of { .divisors.sum { .sqr } })
assert_eq(20.of { .omega }, 20.of { .rad.factor.len })
assert_eq(20.of { .omega }, 20.of { .factor_exp.len })
assert_eq(20.of { .bigomega }, 20.of { .factor.len })
assert_eq(20.of { .gpf }, 20.of { .factor.tail \\ _ })
assert_eq(20.of { .lpf }, 20.of { .factor.head \\ _ })
assert_eq(20.of { .sopf }, 20.of { .rad.factor.sum })
assert_eq(20.of { .sopfr }, 20.of { .factor.sum })
assert_eq(20.of { .factorial }, 20.of { .is_zero ? 1 : _ }.map_reduce{|a,b| a*b })
assert_eq(20.of { .superfactorial }, 20.of { .factorial }.map_reduce{|a,b| a*b })
assert_eq(20.of { .hyperfactorial }, 20.of { _**_ }.map_reduce{|a,b| a*b })
assert_eq(20.of { .subfactorial }, 20.of {|n| (-1)**n / n! }.acc.map_kv {|k,v| k! * v })
assert_eq(20.of { .perfect_power_count }, 20.of { .is_perfect_power && .is_pos ? 1 : 0 }.acc)
assert_eq(20.of { .perfect_power_sum }, 20.of { .is_perfect_power ? _ : 0 }.acc)
for k in (0..3) {
assert_eq(20.of { k.almost_prime_sum(_) }, 20.of { .is_almost_prime(k) ? _ : 0 }.acc)
assert_eq(20.of { k.squarefree_almost_prime_sum(_) }, 20.of { .is_squarefree_almost_prime(k) ? _ : 0 }.acc)
assert_eq(20.of { k.omega_prime_sum(_) }, 20.of { .is_omega_prime(k) ? _ : 0 }.acc)
assert_eq(20.of { k.almost_prime_count(_) }, 20.of { .is_almost_prime(k) ? 1 : 0 }.acc)
assert_eq(20.of { k.squarefree_almost_prime_count(_) }, 20.of { .is_squarefree_almost_prime(k) ? 1 : 0 }.acc)
assert_eq(20.of { k.omega_prime_count(_) }, 20.of { .is_omega_prime(k) ? 1 : 0 }.acc)
assert_eq(20.of { .perfect_power_count(k) }, 20.of { .is_power(k) && .is_pos ? 1 : 0 }.acc)
assert_eq(20.of { .perfect_power_sum(k) }, 20.of { .is_power(k) ? _ : 0 }.acc)
assert_eq(20.of { k.powerful_count(_) }, 20.of { .is_powerful(k) && .is_pos ? 1 : 0 }.acc)
assert_eq(20.of { k.powerful_sum(_) }, 20.of { .is_powerful(k) ? _ : 0 }.acc)
}
assert_eq(20.of { .digits(2).sum }, 20.of { .hammingweight })
assert_eq(20.of { .digits(2).len }, 20.of { .len(2) })
assert_eq(20.of { .digits.len }, 20.of { .len })
assert_eq(20.of { .digits(10).len }, 20.of { .len(10) })
assert_eq(20.of { .sumdigits }, 20.of { .digits.sum })
assert_eq(20.of { .sumdigits(2) }, 20.of { .digits(2).sum })
assert_eq(20.of { .sumdigits(3) }, 20.of { .digits(3).sum })
assert_eq(20.of { .sumdigits(8) }, 20.of { .digits(8).sum })
assert_eq(20.of { .sumdigits(9) }, 20.of { .digits(9).sum })
assert_eq(20.of { .sumdigits(10) }, 20.of { .digits(10).sum })
assert_eq(20.of { .sumdigits(11) }, 20.of { .digits(11).sum })
assert_eq(20.of { .sumdigits(16) }, 20.of { .digits(16).sum })
assert_eq(20.of { .digits.digits2num }, 20.of { _ })
assert_eq(20.of { .digits(2).digits2num(2) }, 20.of { _ })
assert_eq(20.of { .digits(3).digits2num(3) }, 20.of { _ })
assert_eq(20.of { .digits(8).digits2num(8) }, 20.of { _ })
assert_eq(20.of { .digits(9).digits2num(9) }, 20.of { _ })
assert_eq(20.of { .digits(10).digits2num(10) }, 20.of { _ })
assert_eq(20.of { .digits(11).digits2num(11) }, 20.of { _ })
assert_eq(20.of { .digits(16).digits2num(16) }, 20.of { _ })
assert_eq(20.of { composite_sum(0, _, 0) }, 20.of { .composite_count })
assert_eq(20.of { composite_sum(2, _, 0) }, 20.of { .is_composite ? 1 : 0 }.acc)
assert_eq(20.of { composite_sum(3, _, 1) }, 20.of { .is_composite ? _ : 0 }.acc)
assert_eq(20.of { .composite_sum(nil, 2) }, 20.of { .is_composite ? _**2 : 0 }.acc)
assert_eq(20.of { composite_sum(0, _, 2) }, 20.of { .is_composite ? _**2 : 0 }.acc)
assert_eq(20.of { composite_sum(4, _, 3) }, 20.of { .is_composite ? _**3 : 0 }.acc)
assert_eq(20.of { composite_sum(6, _, 3) }, 20.of { (.is_composite && _>=6) ? _**3 : 0 }.acc)
for n in (2147483646, 2147483647, 2147483648, 4294967293, 4294967294, 4294967295, 4294967297, 9223372036854775808, 18446744073709551613, 18446744073709551614, 18446744073709551617) {
assert_eq(n.digits.sum, n.sumdigits)
assert_eq(n.digits.digits2num, n)
assert_eq(n.digits(2).join.flip, n.as_bin)
assert_eq(n.digits(8).join.flip, n.as_oct)
assert_eq(n.digits(16).len, n.as_hex.len)
var bases = [2, 8, 9, 10, 11, 16, 43, n, irand(2, n), irand(2, n**2), irand(2, n**3), irand(2, n.isqrt), irand(2, n.iroot(3)), 4294967294, 4294967295, 4294967296, 4294967297, 2147483646, 2147483647, 2147483648, 2147483649, 1073741823, 1073741829].uniq
var nums = [n, n.irand, irand(n**2), irand(n**3)].uniq
for b in (bases), k in (nums) {
var D = k.digits(b)
assert_eq(D.len, k.len(b))
assert_eq(D.digits2num(b), k)
assert_eq(k.sumdigits(b), D.sum)
}
}
assert_eq(lpf_sum(50, 100), 50..100 -> sum{.lpf})
assert_eq(gpf_sum(50, 100), 50..100 -> sum{.gpf})
assert_eq(convergents(3/2), [1, 3/2])
assert_eq(convergents(2/3), [0, 1, 2/3])
assert_eq(convergents(42), [42])
assert_eq(convergents(-42), [-42])
assert_eq(convergents(2**128 + 1), [2**128 + 1])
assert_eq(42.as_cfrac, [42])
assert_eq(as_cfrac(2**128 + 1), [2**128 + 1])
assert_eq(42.neg.as_cfrac, [-42])
assert_eq((3/4).as_cfrac, [0, 1, 3])
assert_eq((2/3).as_cfrac, [0, 1, 2])
assert_eq(18446744073709551606.next_prime, 18446744073709551629)
assert_eq(18446744073709551629.prev_prime, 18446744073709551557)
assert_eq(euler_numbers(0), %n[1])
assert_eq(euler_numbers(1), %n[1, 0])
assert_eq(euler_numbers(2), %n[1, 0, -1])
assert_eq(euler_numbers(3), %n[1, 0, -1, 0])
assert_eq(euler_numbers(4), %n[1, 0, -1, 0, 5])
assert_eq(bernoulli_numbers(0), %n[1])
assert_eq(bernoulli_numbers(1), %n[1, -1/2])
assert_eq(bernoulli_numbers(2), %n[1, -1/2, 1/6])
assert_eq(bernoulli_numbers(3), %n[1, -1/2, 1/6, 0])
assert_eq(bernoulli_numbers(4), %n[1, -1/2, 1/6, 0, -1/30])
assert_eq( euler_numbers(10), 10.inc.of { .euler_number })
assert_eq( euler_numbers(11), 11.inc.of { .euler_number })
assert_eq(euler_numbers(100), 100.inc.of { .euler_number })
assert_eq(euler_numbers(200), 200.inc.of { .euler_number })
assert_eq( bernoulli_numbers(10), 10.inc.of { .bernoulli(0) })
assert_eq( bernoulli_numbers(11), 11.inc.of { .bernoulli(0) })
assert_eq(bernoulli_numbers(100), 100.inc.of { .bernoulli(0) })
assert_eq(bernoulli_numbers(200), 200.inc.of { .bernoulli(0) })
assert_eq(fubini_numbers(10), %n[1, 1, 3, 13, 75, 541, 4683, 47293, 545835, 7087261, 102247563])
assert_eq(fubini_numbers(5), %n[1, 1, 3, 13, 75, 541])
assert_eq(21.of { .fubini }, %n[1, 1, 3, 13, 75, 541, 4683, 47293, 545835, 7087261, 102247563, 1622632573, 28091567595, 526858348381, 10641342970443, 230283190977853, 5315654681981355, 130370767029135901, 3385534663256845323, 92801587319328411133, 2677687796244384203115])
assert_eq(20.of { .liouville_sum }, %n[0, 1, 0, -1, 0, -1, 0, -1, -2, -1, 0, -1, -2, -3, -2, -1, 0, -1, -2, -3])
assert_eq(liouville_sum(123456), -92)
assert_eq(liouville_sum(12345), -49)
assert_eq(
gather { primes_each(2**65, 2**65 + 1000, {|k| take(k) }) },
prime_count(2**65, 2**65 + 1000).next_primes(2**65),
)
assert_eq(
primes(2**63 - 10, 2**63 + 1000),
prime_count(2**63 - 10, 2**63 + 1000).next_primes(2**63 - 10),
)
assert_eq(
primes(2**64 - 10, 2**64 + 1000),
prime_count(2**64 - 10, 2**64 + 1000).next_primes(2**64 - 10),
)
assert_eq(
primes(2**65, 2**65 + 1000),
prime_count(2**65, 2**65 + 1000).next_primes(2**65),
)
assert_eq(
10.by {|n|
n.is_composite && (divmod(powmod(10, n-1, n)-1, 9, n) == 0)
},
%n[91 259 451 481 703 1729 2821 2981 3367 4141],
)
assert_eq(
(-8 .. 8 -> map { .is_power }),
[true, false, false, false, false, false, false, true, true, true, false, false, true, false, false, false, true]
)
assert_eq(
((-8 .. 8) ~X (-8 .. 8) -> map_2d {|n,k| is_power(n,k) }),
[false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false]
)
for n in ([@|(0..20), 120, 480, 5040, (2**64 + 1)**3, 2**64 + 1, 2**127 - 1, (2**127 - 1)**2]) {
var D = n.divisors
assert_eq(D.sum{|d| phi(d) }, n)
assert_eq(D.sum{|d| phi(d,2) }, n**2)
assert_eq(D.sum{|d| phi(d,3) }, n**3)
var D = n.idivisors
assert_eq(D.sum{|d| iphi(d) }, n)
assert_eq(D.sum{|d| iphi(d,2) }, n**2)
assert_eq(D.sum{|d| iphi(d,3) }, n**3)
var D = n.udivisors
assert_eq(D.sum{|d| uphi(d) }, n)
assert_eq(D.sum{|d| uphi(d,2) }, n**2)
assert_eq(D.sum{|d| uphi(d,3) }, n**3)
}
assert_eq(map(1..70, {.nuphi}), %n[1,2,3,2,5,6,7,4,6,10,11,6,13,14,15,8,17,12,19,10,21,22,23,12,20,26,18,14,29,30,31,16,33,34,35,12,37,38,39,20,41,42,43,22,30,46,47,24,42,40,51,26,53,36,55,28,57,58,59,30,61,62,42,32,65,66,67,34,69,70])
assert_eq(map(1..74, {.bphi}), %n[1,1,2,3,4,3,6,7,8,6,10,8,12,9,9,15,16,12,18,14,14,15,22,17,24,18,26,21,28,15,30,31,23,24,25,29,36,27,28,31,40,21,42,35,34,33,46,36,48,36,37,42,52,39,42,46,42,42,58,34,60,45,51,63,50,35,66,56,51,38,70,62,72,54])
assert_eq(znlog(232752345212475230211680, 23847293847923847239847098123812075234, 804842536444911030681947), 13)
assert_eq(znlog(5678, 5, 10007), 8620)
[
[[5675,5,10000019], 2003974]; # 5675 = 5^2003974 mod 10000019
[[18478760,5,314138927], 34034873];
[[553521,459996,557057], 15471];
[[7443282,4,13524947], 6762454];
(Bool(Num.HAS_PRIME_UTIL) && (Num(Num.ULONG_MAX) > 2**32) ? [[32712908945642193,5,71245073933756341], 5945146967010377] : ());
].each_2d {|t, v|
say "Testing: znlog(#{t.join(', ')}) == #{v}"
assert_eq(znlog(t...), v)
}
assert_eq(
36.of{|n| znlog(2**n - 5, 3, 2**(n+1)) }.join(' '),
%n[NaN, 0, NaN, 1, 7, 3, 27, 43, 75, 139, 11, 779, 267, 1291, 3339, 7435, 32011, 48395, 81163, 146699, 277771, 15627, 1588491, 2637067, 539915, 4734219, 13122827, 63454475, 29900043, 231226635, 97008907, 902315275, 365444363, 1439186187, 3586669835, 7881637131].join(' ')
)
# GCD/LCM tests on negative inputs
assert_eq(lcm(-43), 43)
assert_eq(gcd(-43), 43)
assert_eq(gcud(-43), 43)
assert_eq(lcm(-42.7), 42)
assert_eq(gcd(-42.7), 42)
assert_eq(gcud(-42.7), 42)
assert_eq(lcm(-42.7, 1), 42)
assert_eq(gcd(-42.7, 0), 42)
assert_eq(gcud(-42.7, 0), 42)
assert_eq(lcm(-42.7, 1, 1), 42)
assert_eq(gcd(-42.7, 0, 0), 42)
assert_eq(gcud(-42.7, 0, 0), 42)
assert_eq(lcm(1, 1, -42.7), 42)
assert_eq(gcd(0, 0, -42.7), 42)
assert_eq(gcud(0, 0, -42.7), 42)
assert_eq(farey(5), [0, 1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5, 1]);
assert_eq(10.of{.farey.map{.nu}.sum}, %n[0, 1, 2, 5, 9, 19, 25, 46, 62, 89])
assert_eq(10.of{.farey.map{.de}.sum}, %n[1, 2, 4, 10, 18, 38, 50, 92, 124, 178])
assert_eq([farey_neighbors(5, 1/5)], [0, 1/4])
assert_eq([farey_neighbors(5, 1/4)], [1/5, 1/3])
assert_eq([farey_neighbors(5, 1/3)], [1/4, 2/5])
assert_eq([farey_neighbors(5, 2/5)], [1/3, 1/2])
assert_eq([farey_neighbors(5, 1/2)], [2/5, 3/5])
assert_eq([farey_neighbors(5, 3/5)], [1/2, 2/3])
assert_eq([farey_neighbors(5, 2/3)], [3/5, 3/4])
assert_eq([farey_neighbors(5, 3/4)], [2/3, 4/5])
assert_eq([farey_neighbors(5, 4/5)], [3/4, 1])
assert_eq([farey_neighbors(100, 89/99)], [80/89, 9/10])
assert_eq([farey_neighbors(100, 50/79)], [31/49, 19/30])
assert_eq([farey_neighbors(100, 19/30)], [50/79, 45/71])
assert_eq(egypt_greedy(9/10), %n[2, 3, 15])
assert_eq(egypt_greedy(5/121), %n[25, 757, 763309, 873960180913, 1527612795642093418846225])
assert_eq(egypt_greedy(43/97).sum{.inv}, 43/97)
assert_eq(egypt_greedy(97/43).sum{.inv}, 97/43)
say "** Tests passed!"