#!/usr/bin/ruby
# Tests for squarefree related functions.
assert_eq(
squarefree(2**64 - 100, 2**64 - 1),
range(2**64 - 100, 2**64 - 1).grep{.is_squarefree}
)
assert_eq(
squarefree(2**64 - 50, 2**64 + 1),
range(2**64 - 50, 2**64 + 1).grep{.is_squarefree}
)
assert_eq(
squarefree(2**65 - 100, 2**65 - 1),
range(2**65 - 100, 2**65 - 1).grep{.is_squarefree}
)
assert_eq(
squarefree(2**63 - 100, 2**63 - 1),
range(2**63 - 100, 2**63 - 1).grep{.is_squarefree}
)
assert_eq(
squarefree(2**32 - 100, 2**32 - 1),
range(2**32 - 100, 2**32 - 1).grep{.is_squarefree}
)
assert_eq(
squarefree(2**31 - 100, 2**31 - 1),
range(2**31 - 100, 2**31 - 1).grep{.is_squarefree}
)
assert_eq(
squarefree(100),
1..100 -> grep{.is_squarefree}
)
assert_eq(
gather {
each_squarefree(2**64 - 100, 2**64 - 1, {|k|
take(k)
}),
},
squarefree(2**64 - 100, 2**64 - 1),
)
assert_eq(
gather {
each_squarefree(2**64 - 100, 2**64 - 50, {|k|
take(k)
}),
},
range(2**64 - 100, 2**64 - 50).grep{.is_squarefree}
)
assert_eq(
gather {
each_squarefree(2**64 - 100, 2**64 - 49, {|k|
take(k)
}),
},
range(2**64 - 100, 2**64 - 49).grep{.is_squarefree}
)
assert_eq(
gather {
each_squarefree(2**64 - 100, 2**64 - 50, {|k|
take(k)
})
},
squarefree(2**64 - 100, 2**64 - 50),
)
assert_eq(
gather {
each_squarefree(2**64 - 50, 2**64 + 1, {|k|
take(k)
}),
},
range(2**64 - 50, 2**64 + 1).grep{.is_squarefree}
)
assert_eq(
Math.seq(next_squarefree(0), { .tail.next_squarefree }).while { _ <= 100 },
squarefree(1..100)
)
assert_eq(
Math.seq(next_cubefree(0), { .tail.next_cubefree }).while { _ <= 100 },
cubefree(1..100)
)
assert_eq(
Math.seq(next_powerfree(0,3), { .tail.next_powerfree(3) }).while { _ <= 100 },
1..100 -> grep { .is_powerfree(3) }
)
assert_eq(
Math.seq(next_powerfree(0,4), { .tail.next_powerfree(4) }).while { _ <= 100 },
powerfree(1..100, 4)
)
assert_eq(
Math.seq(next_nonsquarefree(0), { .tail.next_nonsquarefree }).while { _ <= 100 },
nonsquarefree(1..100)
)
assert_eq(
Math.seq(next_noncubefree(0), { .tail.next_noncubefree }).while { _ <= 100 },
noncubefree(1..100)
)
assert_eq(
Math.seq(next_nonpowerfree(0, 4), { .tail.next_nonpowerfree(4) }).while { _ <= 100 },
nonpowerfree(1..100, 4)
)
assert_eq(
Math.seq(next_powerful(0, 4), { .tail.next_powerful(4) }).while { _ <= 100 },
powerful(1..100, 4)
)
for n in (31, 32, 63, 64) {
assert_eq(
Math.seq(next_squarefree(2**n - 11), { .tail.next_squarefree }).while { _ <= (2**n + 100) },
squarefree(range(2**n - 10, 2**n + 100))
)
assert_eq(
Math.seq(next_powerfree(2**n - 11, 3), { .tail.next_powerfree(3) }).while { _ <= (2**n + 100) },
range(2**n - 10, 2**n + 100).grep { .is_powerfree(3) }
)
}
assert_eq(next_powerfree(2**120 - 1e3), 1329227995784915872903807060280343578)
assert_eq(next_powerfree(2**120 - 1e3, 3), 1329227995784915872903807060280343577)
assert_eq(next_powerfree(2**120 - 1e3, 4), 1329227995784915872903807060280343577)
assert_eq(
10.of { .next_squarefree },
%n[1, 2, 3, 5, 5, 6, 7, 10, 10, 10]
)
assert_eq(next_squarefree(0), 1)
assert(next_squarefree(-50).is_nan)
assert_eq(next_squarefree(2**64), 2**64 + 1)
assert_eq(next_squarefree(2**32), 2**32 + 1)
assert_eq(next_squarefree(2**16), 2**16 + 1)
assert_eq(next_powerfree(2**64, 3), 2**64 + 1)
assert_eq(next_powerfree(2**32, 3), 2**32 + 1)
assert_eq(next_powerfree(2**16, 3), 2**16 + 1)
assert_eq(next_squarefree(2**16 - 1), 2**16 + 1)
assert_eq(next_squarefree(2**32 - 1), 2**32 + 1)
assert_eq(next_squarefree(2**64 - 1), 2**64 + 1)
assert_eq(next_squarefree(2**16 - 2), 2**16 - 1)
assert_eq(next_squarefree(2**32 - 2), 2**32 - 1)
assert_eq(next_squarefree(2**64 - 2), 2**64 - 1)
assert_eq(next_squarefree(2**128 - 2), 2**128 - 1)
assert_eq(next_squarefree(2**64 + 3), 2**64 + 5)
assert_eq(43.square_free_count, 29)
assert_eq(square_free_count(-10, 43), 29)
assert_eq(square_free_count(2, 43), 28)
assert_eq(square_free_count(4, 43), 26)
assert_eq(square_free_count(1e6), 607926)
assert_eq(square_free_count(1e5, 1e6), 547132)
assert_eq(square_free_count(1e5 - 2, 1e6 - 3), 547133)
assert_eq(square_free_count(1e5 - 1, 1e6 - 3), 547132)
assert_eq(square_free_count(1e5 - 2, 1e6 - 1), 547133)
for n in (1..8), k in (2..15 -> map{|b| b**n }) {
var t = nth_squarefree(k)
assert(t.is_squarefree)
assert_eq(t.squarefree_count, k)
}
assert_eq(3000.of{.nth_squarefree}.slice(1), 3000.dec.by{.is_squarefree})
say "** Test passed!"