Skip to content

Commit 929f1af

Browse files
committed
Calculate sums of divisors using new sieves.
1 parent 27167cd commit 929f1af

File tree

4 files changed

+14
-28
lines changed

4 files changed

+14
-28
lines changed

021.scala

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
val sieve = helpers.Sieve(100)
1+
val N = 10000 - 1
22

3-
val result = (2 until 10000).filter { i =>
4-
val other = (sieve.sumOfDivisors(i) - i).toInt
5-
i != other && i == sieve.sumOfDivisors(other) - other
3+
val sieve = sieves.DivisorSum(3 * N)
4+
5+
val result = (2 to N).filter { i =>
6+
val other = sieve(i) - i
7+
i != other && i == sieve(other) - other
68
}
79

810
println(result.sum)

023.scala

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import scala.collection.Searching._
22

3-
val sieve = helpers.Sieve(168)
3+
val N = 28123
44

5-
val abundant = (1 to 28123).filter( i =>
6-
sieve.sumOfDivisors(i) > 2*i
5+
val sieve = sieves.DivisorSum(N)
6+
7+
val abundant = (1 to N).filter( i =>
8+
sieve(i) > 2*i
79
)
810

9-
val result = (1 to 28123).filter( i =>
11+
val result = (1 to N).filter( i =>
1012
abundant.takeWhile(_ < i).forall( j =>
1113
abundant.search(i - j) match {
1214
case Found(_) => false

095.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
val N = 1000000
2-
val sieve = helpers.Sieve(1000)
2+
val sieve = sieves.DivisorSum(N)
33

44
var seen = Set(1)
55
var longest = -1
@@ -12,7 +12,7 @@ var result = 0
1212
seen += i
1313
step += 1
1414
chain += i -> step
15-
i = sieve.sumOfDivisors(i).toInt - i
15+
i = sieve(i) - i
1616
}
1717
if (chain.contains(i)) {
1818
val length = step - chain(i) + 1

Helpers.scala

-18
Original file line numberDiff line numberDiff line change
@@ -51,24 +51,6 @@ case class Sieve(n: Int) {
5151

5252

5353

54-
def sumOfDivisors(num: Int): Long = {
55-
var n = num
56-
var result = 1L
57-
primes.takeWhile( p =>
58-
n != 1 && p*p <= n
59-
).foreach { p =>
60-
var cur = p
61-
while(n % p == 0) {
62-
n /= p
63-
cur *= p
64-
}
65-
if (cur != p)
66-
result *= (cur - 1)/(p - 1)
67-
}
68-
if (n != 1)
69-
result *= (n.toLong*n - 1)/(n - 1)
70-
result
71-
}
7254

7355
def numberOfDivisors(num: Int, power: Int = 1): Int = {
7456
var n = num

0 commit comments

Comments
 (0)