https://projecteuler.net/problem=48
そのままですね。
import sys #################### library #################### fn add(a: Int, b: Int, d: Int) -> Int: var c = a + b if c < 0: # overflow c -= d elif c >= d: c -= d return c fn mul2(a: Int, b: Int, d: Int, e1: Int, e2: Int) -> Int: var n = 0 var a1 = a for i in range(0, e2, e1): var b1 = (b >> i) & ((1 << e1) - 1) n += a1 * b1 % d a1 = (a1 << e1) % d return n % d fn mul3(a: Int, b: Int, d: Int, e1: Int, e2: Int) -> Int: var n = 0 var a1 = a for i in range(0, e2, e1): var b1 = (b >> i) & ((1 << e1) - 1) n = add(n, a1 * b1 % d, d) a1 = (a1 << e1) % d return n fn mul4(a: Int, b: Int, d: Int) -> Int: var n = 0 var a1 = a for i in range(0, 63): var b1 = (b >> i) & 1 if b1 == 1: n = add(n, a1, d) a1 = add(a1, a1, d) return n fn mul(a: Int, b: Int, d: Int) -> Int: if d < 1 << 31: return a * b % d elif d < 1 << 40: var b1 = b & ((1 << 20) - 1) var b2 = b >> 20 var n1 = a * b1 var n2 = (a * b2 % d) << 20 return (n1 + n2) % d elif d < 1 << 45: return mul2(a, b, d, 15, 45) elif d < 1 << 48: return mul2(a, b, d, 12, 48) elif d < 1 << 50: return mul2(a, b, d, 10, 50) elif d < 1 << 54: return mul3(a, b, d, 6, 54) elif d < 1 << 55: return mul3(a, b, d, 5, 55) elif d < 1 << 56: return mul3(a, b, d, 4, 56) elif d < 1 << 57: return mul3(a, b, d, 3, 57) elif d < 1 << 60: return mul3(a, b, d, 2, 60) else: return mul4(a, b, d) fn pow(n: Int, e: Int, d: Int) -> Int: if e == 0: return 1 elif e == 1: return n elif (e & 1) == 1: return mul(n, pow(n, e-1, d), d) else: var m = pow(n, e>>1, d) return mul(m, m, d) #################### process #################### fn f(N: Int, d: Int) -> Int: var s = 0 for n in range(1, N+1): s += pow(n, n, d) return s % d fn main() raises: var args = sys.argv() var N = atol(args[1]) print(f(N, 10**10))