-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproblem3.js
90 lines (77 loc) · 1.95 KB
/
problem3.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// The prime factors of 13195 are 5, 7, 13 and 29.
// What is the largest prime factor of the number 600851475143 ?
const number = 600851475143;
function* primeGenerator(limit) {
let primes = []
let next = 2
let nexiIsAPrime, searching = true;
while (searching && next <= limit) {
nexiIsAPrime = true
for (let i = 0; i < primes.length; i++) {
if (next % primes[i] == 0) {
nexiIsAPrime = false
break
}
}
if (nexiIsAPrime) {
primes.push(next)
yield next
}
if (next == 2) {
next += 1
}
else {
next += 2
}
}
return `Limit of ${limit} has been reached`
}
function isPrime(number) {
let limitReached = false, nextPrime = 0
let generator = primeGenerator(number)
while (!limitReached && nextPrime <= number) {
nextPrime = generator.next().value
if (number === nextPrime) {
return true
}
}
return false
}
function findLargestPrimeFactor(number) {
let start = Math.ceil(Math.sqrt(number))
console.log(`start is ${start}`)
// if root is even, make it odd. 2 is the only even prime number.
if (start % 2 == 0) {
start -= 1
}
while (start > 1) {
// if number can be divided precisely, check if divisor is a prime
if (number % start == 0) {
if (isPrime(start)) {
return start
}
}
start -= 2
}
}
function primeFactorMethod(number) {
let generator = primeGenerator(number)
prime = generator.next().value
while ((prime * prime) < number) {
if (number % prime == 0) {
console.log(`${number}/${prime} = ${number/prime}`)
number = number / prime
}
prime = generator.next().value
}
if (prime > number) {
return prime
}
return number
}
const startTime = Date.now()
// console.log(findLargestPrimeFactor(number))
console.log(primeFactorMethod(number))
const endTime = Date.now()
const runningTime = endTime - startTime
console.log(`Running time (s): ${runningTime / 1000}`)