""" project euler problem 135 正の整数x, y, z が等差数列として与えられたとき、 x2 - y2 - z2 = n がちょうど2個の解を持つような最小の正の整数 n は、n = 27である。 34^2 − 27^2 − 20^2 = 12^2 − 9^2 − 6^2 = 27 n = 1155 は、方程式がちょうど10個の解を持つ最小の値である。 ちょうど10個の解を持つような n は、100万までにいくつ存在するか? """ import time import Euler time1 = time.time() n = 0 check = 0 count = 0 primelist = Euler.prime_make(1000000) print(time.time() - time1) while n < 1000000: n += 1 if n in primelist: continue x = 0 while x <= n / 2: x += 1 if n % x == 0 and n / x > x and (n / x - x) % 2 == 0: check += 1 if check == 10: count += 1 check = 0 if time.time() - time1 > 60: break
1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 .... 上から8行見るとパスカルの三角形は12個の異なる数を含む. 1, 2, 3, 4, 5, 6, 7, 10, 15, 20, 21, 35である. 任意の素数の二乗がnを割り切らないとき, 正整数nが平方因子を持たないと言う. 先ほどの12個の数字を見ると, 4, 20以外は平方因子を持たない. 従って, 最初の8行の平方因子を持たない異なる数の和は105になる. パスカルの三角形の最初の51行に含まれる平方因子を持たない異なる数の和を答えよ. """ import time import math import Euler time1 = time.time() sosu = Euler.prime_make(50000) trilist = [x for x in range(1, 50)] answerlist = [] for i in range(2, 51): for j in range(int(i)): trilist.append( (math.factorial(i) / (math.factorial(j) * math.factorial(i - j)))) trilist = list(set(trilist)) for k in trilist: check = 1 for l in sosu: if k % (l ** 2) == 0: check = 0 break if check == 1: answerlist.append(k)
#!/usr/bin/env python # -*- coding: utf-8 -*- """ project euler problem 187 合成数とは2つ以上の素因数を含む整数のことである. 例えば15 = 3 × 5, 9 = 3 × 3, 12 = 2 × 2 × 3が合成数である. 30以下には丁度2つの素因数を含む合成数 (異なる素因数でなくてもよい) が, 10個存在する. 4, 6, 9, 10, 14, 15, 21, 22, 25, 26がそうである. 合成数n < 10^8について, 丁度2つの素因数を含む合成数 (異なる素因数でなくてもよい) の数を答えよ. """ import time import Euler t0 = time.time() primes = tuple(Euler.prime_make(50000000)) answer_count = 0 for i in primes: if int(i) > 10000: break print(i) for j in primes: if j < i: continue if int(i) * int(j) >= 10 ** 8: break answer_count += 1 print(answer_count) print(time.time() - t0, "seconds")
#!/usr/bin/env python # -*- coding: utf-8 -*- """ project euler problem 91 素数の2乗と素数の3乗と素数の4乗の和で表される最小の数は28である. 50未満のこのような数は丁度4つある. 28 = 2^2 + 2^3 + 2^4 33 = 3^2 + 2^3 + 2^4 49 = 5^2 + 2^3 + 2^4 47 = 2^2 + 3^3 + 2^4 では, 50,000,000未満の数で, 素数の2乗と素数の3乗と素数の4乗の和で表される数は何個あるか? """ import time import Euler t0 = time.time() primes = Euler.prime_make(7080) answerlist = [] for x in primes: # 7079**2>50000000 for y in [i for i in primes if i < 374]: # 374**3>50000000 for z in [k for k in primes if k < 90]: # 89**4>50000000 num = x ** 2 + y ** 3 + z ** 4 if num < 50000000: answerlist.append(num) answerlist = list(set(answerlist)) answerlist.sort() print(len(answerlist)) print(time.time() - t0, "seconds")
#!/usr/bin/env python # -*- coding: utf-8 -*- """ project euler problem 179 nとn + 1 の正の約数の数が同じになる 1 < n < 10^7 の整数は幾つあるか。 例として, 14 の正の約数は 1, 2, 7, 14 であり, 15 の正の約数は 1, 3, 5, 15 である. """ import time import Euler from functools import reduce t0 = time.time() answer = 0 n = 1 lst = [0, 1] primes = Euler.prime_make(10 ** 5) def factors(n, lists): lists if n == 1: return {1: 1} elif n == 2: return {2: 1} elif n == 3: return {3: 1} xd = {} for i in lists: moto = n while n % i == 0: if i in xd:
# coding:utf-8 """ Project Euler Problem 123 p_n を n 番目の素数とする. (p_1 = 2, p2 = 3, ...) r を (p_n - 1)^n + (p_n + 1)^n を p_n^2 で割った余りとする. 例えば, n = 3 のとき, p_3 = 5 であり, 4^3 + 6^3 = 280 ≡ 5 mod 25. 余り r が 10^9 より大きくなる n の最小値は 7037 である. 余り r が 10^10 より大きくなる最初の n を求めよ. """ import time import Euler t1 = time.time() primes = Euler.prime_make(1000000) primes.insert(0, 0) primes = tuple(primes) for i in range(7038, len(primes)): if i % 2 == 0: continue m = ((primes[i] - 1) ** i + (primes[i] + 1) ** i) % (primes[i] ** 2) if i % 100 < 3: print(i, m) if m > 10 ** 10: break print(i) print(time.time() - t1, "seconds")
100未満の素数を連続する素数の和で表したときにこれが最長になる. 同様に, 連続する素数の和で1000未満の素数を表したときに最長になるのは953で21項を持つ. 100万未満の素数を連続する素数の和で表したときに最長になるのはどの素数か? """ import time import Euler time1 = time.time() maxl = 0 limit = 1000000 answer = 0 max_kosuu = 550 # この個数を超えて和を求めても100万を超過する primes = tuple(Euler.prime_make(limit)) primes_2 = tuple(primes[1:]) for i in range(2, max_kosuu, 2): sums = sum(primes[:i]) length = len(primes[:i]) if sums > limit: break if length > maxl and sums in primes: maxl = length answer = sums print(maxl, """primes[:i],""""sum is", sums) for i in range(3, max_kosuu, 2): for j in range(len(primes_2) - i): sums = sum(primes_2[j:i])