Example #1
0
"""
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
Example #2
0
  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)
Example #3
0
#!/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")
Example #4
0
#!/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")
Example #5
0
#!/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:
Example #6
0
# 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")
Example #7
0
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])