Let us implement the Sieve of Atkin algorithm, so we can generate prime numbers.
functionatkinSieve(N::Int) sieve =falses(N)if N >=2 sieve[2] =trueendif N >=3 sieve[3] =trueendif N >=5 sieve[5] =trueendfor x in1:isqrt(N)for y in1:isqrt(N) n =4*x*x + y*yif n <= N && (mod(n, 12) ==1||mod(n, 12) ==5) sieve[n] = !sieve[n]end n =3*x*x + y*yif n <= N &&mod(n, 12) ==7 sieve[n] = !sieve[n]endif x > y n =3*x*x - y*yif n <= N &&mod(n, 12) ==11 sieve[n] = !sieve[n]endendendendfor r in5:isqrt(N)if sieve[r]for i in r*r:r*r:N sieve[i] =falseendendend [i for i in1:N if sieve[i]]end
atkinSieve (generic function with 1 method)
For the next part of the problem we need to develope an algorithm that finds the prime factorization for any integer \(K\).
functionprimeFactor(K::Int)if K <=0throw(DomainError(K, "Input must be a positive integer"))elseif K ==1returnDict{Int, Int}()end# generate prime numbers up to sqrt(K)+1 primes =atkinSieve(isqrt(K) +1) factors =Dict{Int, Int}() remaining = Kfor p in primesif remaining ==1breakend power =0# count how many times p divides remainingwhilemod(remaining, p) ==0 power +=1 remaining ÷= pend# add the prime factor to dict# the value represents how many times that factor divided remainingif power >0 factors[p] = powerendend# if the remaining value is greater than 1, it must be prime# if it were composite it would have at least one prime factor less than or equal to sqrt(K)# which we would have diveded out already.if remaining >1 factors[remaining] =1end factorsendprimeFactor(600851475143)