-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnumberTheory.kt
More file actions
35 lines (34 loc) · 822 Bytes
/
numberTheory.kt
File metadata and controls
35 lines (34 loc) · 822 Bytes
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
private fun largestPrimeDivisors(n: Int): IntArray {
val largestPrimeDivisors = IntArray(n + 1) { it }
for (i in 2..n) {
if (largestPrimeDivisors[i] < i) continue
var j = i * i
if (j > n) break
do {
largestPrimeDivisors[j] = i
j += i
} while (j <= n)
}
return largestPrimeDivisors
}
private fun divisorsOf(n: Int, largestPrimeDivisors: IntArray): IntArray {
if (n == 1) return intArrayOf(1)
val p = largestPrimeDivisors[n]
if (p == n) return intArrayOf(1, n)
var m = n / p
var counter = 2
while (m % p == 0) {
m /= p
counter++
}
val divisorsOfM = divisorsOf(m, largestPrimeDivisors)
val result = IntArray(divisorsOfM.size * counter)
for (i in divisorsOfM.indices) {
var d = divisorsOfM[i]
for (j in 0 until counter) {
result[i * counter + j] = d
d *= p
}
}
return result
}