Question
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
Go
package main
import "fmt"
import "math"
import "math/big"
func eratosthenes(max int) []int {
:= make([]int, max)
nums
:= 2 // first prime, 2
p for {
:= p - 1
i // mark multiples not prime
for i += p; i < max; i += p {
[i] = -1
nums}
// find first unmarked number greater than p
for i = p; i < max; i++ {
if nums[i] != -1 {
= i + 1
p break
}
}
// no unmarked numbers greater than p found; finished
if i == max {
break
}
}
// filter out all marked numbers
:= make([]int, max)
primes := 0
j for i := range nums {
if nums[i] == 0 {
[j] = i + 1
primes++
j}
}
return primes[:j]
}
func main() {
:= new(big.Int)
n .SetString("600851475143", 10)
n:= new(big.Int)
m := int(math.Sqrt(600851475143))
max := eratosthenes(max)
primes // find the largest prime factor of n
for i := len(primes) - 1; i >= 0; i-- {
:= big.NewInt(int64(primes[i]))
p .Mod(n, p)
mif m.Int64() == 0 {
.Println(p)
fmtbreak
}
}
}
$ go build -o prime-factor prime-factor.go
$ time ./prime-factor
real 0m0.018s
user 0m0.018s
sys 0m0.009s
Haskell
primes :: [Integer]
= sieve [2..] where
primes :xs) = p : sieve [x | x <- xs, x `mod` p > 0]
sieve (p
factorize :: Integer -> [Integer]
= primeFactors n primes where
factorize n 1 _ = []
primeFactors :ps) | m < p * p = [m]
primeFactors m (p| r == 0 = p : primeFactors q (p:ps)
| otherwise = primeFactors m ps
where (q, r) = quotRem m p
main :: IO ()
= print $ maximum $ factorize 600851475143 main
$ ghc -O2 -o prime-factor prime-factor.hs
$ time ./prime-factor
real 0m0.003s
user 0m0.000s
sys 0m0.003s
JavaScript
let n = 600851475143
let limit = Math.ceil(Math.sqrt(n))
for (var i = 3; i <= limit; i += 2) {
while (n % i === 0) {
= Math.floor(n / i)
n = Math.ceil(Math.sqrt(n))
limit
}
}console.log(n)
$ time node --use-strict prime-factor.js
real 0m0.052s
user 0m0.046s
sys 0m0.007s
Python
#!/usr/bin/env python
import math
def factorize(n):
= []
res # iterate over all even numbers first.
while n % 2 == 0:
2)
res.append(//= 2
n # try odd numbers up to sqrt(n)
= math.sqrt(n+1)
limit = 3
i while i <= limit:
if n % i == 0:
res.append(i)//= i
n = math.sqrt(n+i)
limit else:
+= 2
i if n != 1:
res.append(n)return res
print(max(factorize(600851475143)))
$ time python3 prime-factor.py
real 0m0.018s
user 0m0.018s
sys 0m0.000s
Ruby
#!/usr/bin/env ruby
def factorize(orig)
= {}
factors .default = 0 # return 0 instead nil if key not found in hash
factors= orig
n = 2
i = 4 # square of i
sqi <= n do
while sqi .modulo(i) == 0 do
while n/= i
n [i] += 1
factors# puts "Found factor #{i}"
end
# we take advantage of the fact that (i +1)**2 = i**2 + 2*i +1
+= 2 * i + 1
sqi += 1
i end
if (n != 1) && (n != orig)
[n] += 1
factorsend
factorsend
puts factorize(600851475143).keys.max
$ time ruby prime-factor.rb
real 0m0.038s
user 0m0.038s
sys 0m0.000s
Rust
fn main() {
let mut n: u64 = 600851475143;
let mut limit = n / 2;
let mut i = 3;
while i < limit {
while n % i == 0 {
= n / i;
n = n / 2;
limit }
+= 2;
i }
println!("{}", n);
}
$ rustc -C target-cpu=native -C opt-level=3 -o prime-factor prime-factor.rs
$ time ./prime-factor
real 0m0.001s
user 0m0.000s
sys 0m0.001s