26 lines
795 B
Crystal
26 lines
795 B
Crystal
struct Int
|
|
# from [[Primality by trial division#Crystal]], slightly adjusted
|
|
def prime?
|
|
n = self.abs
|
|
return n == 2 || n == 3 || n == 5 if n < 7
|
|
return false if n.gcd(30) != 1
|
|
p = typeof(n).new(7)
|
|
√n = Math.isqrt(n)
|
|
until p > √n
|
|
return false if
|
|
n % (p) == 0 || n % (p+4) == 0 || n % (p+6) == 0 || n % (p+10) == 0 ||
|
|
n % (p+12) == 0 || n % (p+16) == 0 || n % (p+22) == 0 || n % (p+24) == 0
|
|
p += 30
|
|
end
|
|
true
|
|
end
|
|
end
|
|
|
|
print "First 20 primes:\n "
|
|
p (1..).each.select(&.prime?).first(20).to_a
|
|
print "Primes between 100 and 150:\n "
|
|
p (100..150).select(&.prime?)
|
|
print "Number of primes between 7,700 and 8,000: "
|
|
puts (7700..8000).count &.prime?
|
|
print "The 10,000th prime: "
|
|
puts (1..).each.select(&.prime?).skip(9999).next
|