Added solutions for N=120-150
parent
56f12e1fd2
commit
9fcd15dba8
|
@ -0,0 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def main(n):
|
||||
return sum(a*(a-2+a%2) for a in range(3, n+1))
|
||||
|
||||
print(main(1000))
|
|
@ -0,0 +1,18 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from fractions import Fraction
|
||||
|
||||
def search(turns, wins=0, discs=2, cache={}):
|
||||
if discs - 2 == turns:
|
||||
return 2* wins > turns
|
||||
if turns // 2 - wins > turns - discs + 1:
|
||||
return 0
|
||||
if (discs, wins) in cache:
|
||||
return cache[(discs, wins)]
|
||||
r = Fraction(1, discs) * search(turns, wins+1, discs+1)
|
||||
r += Fraction(discs-1, discs) * search(turns, wins, discs+1)
|
||||
cache[(discs, wins)] = r
|
||||
return r
|
||||
|
||||
N = 15
|
||||
print(int(search(N)**(-1)))
|
|
@ -0,0 +1,23 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from itertools import combinations_with_replacement as comb
|
||||
|
||||
bound = 200
|
||||
sieve = [i-1 for i in range(bound+1)]
|
||||
dup = []
|
||||
|
||||
def rec(chain, sieve, bound, id=0):
|
||||
c = 1
|
||||
for m in chain:
|
||||
n = m+chain[0]
|
||||
if n > bound:
|
||||
continue
|
||||
if len(chain) >= max(sieve[n:n+3]): #<-- trial and error magic
|
||||
continue
|
||||
if len(chain) < sieve[n]:
|
||||
sieve[n] = len(chain)
|
||||
c += rec([n] + chain, sieve, bound, id+1)
|
||||
return c
|
||||
|
||||
rec([1], sieve, bound)
|
||||
print(sum(sieve[2:]))
|
|
@ -0,0 +1,20 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def main(m, lim=10**7):
|
||||
for n, p in enumerate(primes(lim), 1):
|
||||
r = ((2*n)%p)*p if n%2 else 2
|
||||
if r > m:
|
||||
return n, p, r
|
||||
return False
|
||||
|
||||
def primes(n):
|
||||
sieve = [True]*n
|
||||
for p in range(2, len(sieve)):
|
||||
if not sieve[p]:
|
||||
continue
|
||||
for i in range(2*p, len(sieve), p):
|
||||
sieve[i] = False
|
||||
yield p
|
||||
|
||||
#print(main(10**9, 10**6))
|
||||
print(main(10**10, 10**6)[0])
|
|
@ -0,0 +1,14 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def radicals(n):
|
||||
sieve = [1]*(n+1)
|
||||
for p in range(2,n+1):
|
||||
if sieve[p] > 1:
|
||||
continue
|
||||
for m in range(p, n+1, p):
|
||||
sieve[m] *= p
|
||||
return zip(range(n+1), sieve)
|
||||
|
||||
rads = list(radicals(10**5))
|
||||
rads.sort(key = lambda x: x[1])
|
||||
print(rads[10**4][0])
|
|
@ -0,0 +1,19 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from math import sqrt
|
||||
|
||||
def is_palindrome(n):
|
||||
return str(n) == str(n)[::-1]
|
||||
|
||||
lim = 10**8
|
||||
nums = []
|
||||
|
||||
for n in range(2, int(sqrt(lim))+1):
|
||||
s = (n-1)**2 + n**2
|
||||
while s < lim:
|
||||
if is_palindrome(s) and s not in nums:
|
||||
nums.append(s)
|
||||
n += 1
|
||||
s += n**2
|
||||
|
||||
print(sum(nums))
|
|
@ -0,0 +1,23 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def fst_layer(a, b, c):
|
||||
return 2*(a*b + a*c + b*c)
|
||||
|
||||
def abc(n):
|
||||
for a in range(1, int((n//6)**0.5)+1):
|
||||
for b in range(a, int((a**2 + n//2)**0.5) - a):
|
||||
for c in range(b, (n - 2*a*b) // (2*a + 2*b)):
|
||||
yield a,b,c
|
||||
|
||||
n = 2*10**4
|
||||
sieve = [0]*n
|
||||
|
||||
for a,b,c in abc(n):
|
||||
m = 0
|
||||
lyn = fst_layer(a, b, c)
|
||||
while lyn < n:
|
||||
sieve[lyn] += 1
|
||||
lyn += 4*(2*m + a + b + c)
|
||||
m += 1
|
||||
|
||||
print(sieve.index(1000))
|
|
@ -0,0 +1,46 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from math import gcd
|
||||
from collections import defaultdict
|
||||
|
||||
def getreps(n):
|
||||
sieve = [1] * n
|
||||
yield 1, 1
|
||||
for p in range(2, n):
|
||||
if sieve[p] == 1:
|
||||
for i in range(p, n, p):
|
||||
sieve[i] *= p
|
||||
yield p, sieve[p]
|
||||
|
||||
|
||||
N = 120000
|
||||
|
||||
repunits = list(getreps(N))
|
||||
sortedreps = sorted(set(list(zip(*repunits))[1]))
|
||||
repmap = defaultdict(list)
|
||||
for n, rep in repunits:
|
||||
repmap[rep].append(n)
|
||||
|
||||
count = 0
|
||||
s = 0
|
||||
|
||||
for c, repC in repunits:
|
||||
root = c // repC
|
||||
if root <= 2:
|
||||
continue
|
||||
for repA in sortedreps:
|
||||
if repA >= root:
|
||||
break
|
||||
if gcd(repA, repC) != 1:
|
||||
continue
|
||||
for a in repmap[repA]:
|
||||
if 2*a >= c:
|
||||
break
|
||||
b = c - a
|
||||
repB = repunits[b-1][1]
|
||||
if repA*repB >= root:
|
||||
continue
|
||||
count += 1
|
||||
s += c
|
||||
|
||||
print(s)
|
|
@ -0,0 +1,42 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def primes(n):
|
||||
sieve = [True] * n
|
||||
for p in range(2, int(n**0.5)):
|
||||
if not sieve[p]:
|
||||
continue
|
||||
for i in range(p**2, n, p):
|
||||
sieve[i] = False
|
||||
return [False, False] + sieve[2:]
|
||||
|
||||
def is_prime(p):
|
||||
if p >= len(sieve):
|
||||
raise LimitError
|
||||
return sieve[p]
|
||||
|
||||
def getnum(n, c):
|
||||
m = n//6
|
||||
if c:
|
||||
return 3*(m-1)*m + 2
|
||||
return 3*m*(m+1) + 1
|
||||
|
||||
sieve = primes(10**6)
|
||||
target = 2000
|
||||
|
||||
c = 2
|
||||
n = 6
|
||||
|
||||
while c < target:
|
||||
n += 6
|
||||
if not is_prime(n-1):
|
||||
continue
|
||||
c += is_prime(n+1) and is_prime(2*n + 5)
|
||||
if c == target:
|
||||
flag = True
|
||||
break
|
||||
c += is_prime(n+5) and is_prime(2*n-7)
|
||||
else:
|
||||
flag = False
|
||||
|
||||
print(getnum(n, flag))
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def minrep(n):
|
||||
base = 10 % (9*n)
|
||||
m = base
|
||||
c = 1
|
||||
while m != 1:
|
||||
m = (m * base) % (9*n)
|
||||
c += 1
|
||||
return c
|
||||
|
||||
target = 10**6
|
||||
n = target + (not target%2)
|
||||
|
||||
while n%5 == 0 or minrep(n) < target:
|
||||
n += 2
|
||||
|
||||
print(n)
|
|
@ -0,0 +1,49 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def divisors(divs):
|
||||
r = []
|
||||
for p in divs:
|
||||
r += [p*d for d in r] + [p]
|
||||
return r
|
||||
|
||||
def add_divisors(n, st=2):
|
||||
for i in range(st*n, len(sieve), st*n):
|
||||
sieve[i].append(n)
|
||||
pw = 2
|
||||
while n**pw < len(sieve):
|
||||
m = n**pw
|
||||
for i in range(st*m, len(sieve), st*m):
|
||||
sieve[i][-1] *= n
|
||||
pw += 1
|
||||
|
||||
target = 25
|
||||
count = 0
|
||||
s = 0
|
||||
|
||||
lim = 10**5
|
||||
sieve = [x for i in range(lim//2) for x in ([], True)]
|
||||
|
||||
add_divisors(2, st=1)
|
||||
|
||||
for p in range(3, len(sieve)):
|
||||
if not p%2 and not sieve[p+1]:
|
||||
for d in divisors(sieve[p]):
|
||||
if pow(10, d, 9*p+9) == 1:
|
||||
break
|
||||
else:
|
||||
continue
|
||||
count += 1
|
||||
s += p + 1
|
||||
#print(count, p+1)
|
||||
if count >= target:
|
||||
break
|
||||
if not p%2 or not sieve[p]:
|
||||
continue
|
||||
for i in range(p**2, len(sieve), 2*p):
|
||||
sieve[i] = False
|
||||
add_divisors(p)
|
||||
|
||||
if count < target:
|
||||
print("Limit reached. Count = {}/{}".format(count,target))
|
||||
|
||||
print(s)
|
|
@ -0,0 +1,25 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def primes(n):
|
||||
sieve = [False] * n
|
||||
for p in range(2, n):
|
||||
if sieve[p]:
|
||||
continue
|
||||
for i in range(p**2, n, p):
|
||||
sieve[i] = True
|
||||
return sieve
|
||||
|
||||
bound = 10**6
|
||||
sieve = primes(bound)
|
||||
c = 0
|
||||
|
||||
n = 1
|
||||
cube_diff = 7
|
||||
|
||||
while cube_diff < bound:
|
||||
if not sieve[cube_diff]:
|
||||
c += 1
|
||||
n += 1
|
||||
cube_diff = 3*n**2 + 3*n + 1
|
||||
|
||||
print(c)
|
|
@ -0,0 +1,32 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def primes(n):
|
||||
sieve = [True] * n
|
||||
for p in range(2, int(n**0.5)):
|
||||
if not sieve[p]:
|
||||
continue
|
||||
for i in range(p**2, n, p):
|
||||
sieve[i] = False
|
||||
return [i for i, p in enumerate(sieve) if p][2:]
|
||||
|
||||
target = 40
|
||||
repw = 10**9
|
||||
lim = 10**6
|
||||
nums = primes(lim)
|
||||
c = 0
|
||||
s = 0
|
||||
|
||||
for p in nums[3:]:
|
||||
if p%4 != 1 and p%5 != 1:
|
||||
continue
|
||||
if pow(10, repw, 9*p) == 1:
|
||||
c += 1
|
||||
s += p
|
||||
#print c, p
|
||||
if c == target:
|
||||
break
|
||||
|
||||
if c < target:
|
||||
print("Limit reached. Count = {}/{}".format(c, target))
|
||||
|
||||
print(s)
|
|
@ -0,0 +1,27 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def add_divisors(n):
|
||||
for k in range(1, (len(sieve) - 1) // n):
|
||||
sieve[k*n] *= n * (sieve[k] // sieve[k*n])
|
||||
|
||||
def primes(n):
|
||||
for p in range(3, int(n**0.5), 2):
|
||||
if sieve[p] != 1:
|
||||
continue
|
||||
for i in range(p**2, n, 2*p):
|
||||
sieve[i] = 0
|
||||
|
||||
n = 10**5
|
||||
sieve = [1] * n
|
||||
|
||||
add_divisors(2)
|
||||
add_divisors(5)
|
||||
primes(n)
|
||||
|
||||
s = 0
|
||||
|
||||
for p in range(7, n, 2):
|
||||
if sieve[p] == 1 and pow(10, sieve[p-1], 9*p) != 1:
|
||||
s += p
|
||||
|
||||
print(s + 2 + 3 + 5)
|
|
@ -0,0 +1,41 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def primes(n):
|
||||
sieve = [False]*n
|
||||
for p in range(2, int(n**0.5)):
|
||||
if sieve[p]:
|
||||
continue
|
||||
for i in range(p**2, n, p):
|
||||
sieve[i] = True
|
||||
return [p for p, t in enumerate(sieve) if not t][2:]
|
||||
|
||||
def solve(p1, p2, k):
|
||||
t = extended_euclid(p2, k)
|
||||
return ((t * p1) % k) * p2
|
||||
|
||||
def extended_euclid(p2, k):
|
||||
a = k
|
||||
b = p2
|
||||
t1, t2 = 0, 1
|
||||
while b != 0:
|
||||
k = a // b
|
||||
a, b = b, a % b
|
||||
t1, t2 = t2, t1 - k*t2
|
||||
return t1
|
||||
|
||||
|
||||
n = 10**6
|
||||
|
||||
|
||||
nums = primes(n + 1000)
|
||||
nums = [nums[i] for i in range(1, len(nums)) if nums[i-1] <= n]
|
||||
|
||||
k = 10
|
||||
s = 0
|
||||
|
||||
for p1, p2 in zip(nums[1:], nums[2:]):
|
||||
if p1 > k:
|
||||
k *= 10
|
||||
s += solve(p1, p2, k)
|
||||
|
||||
print(s)
|
|
@ -0,0 +1,19 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
N = 10 ** 6
|
||||
target = 10
|
||||
|
||||
sieve = [0] * N
|
||||
|
||||
m = 3
|
||||
while 2*m - 1 < 3*N:
|
||||
n = m - 1 - (not m % 2)
|
||||
i = (m - n) * (m + n)
|
||||
while i < 3*N and n > 0:
|
||||
if not i % 3 and not (m - (n//2)) % 3:
|
||||
sieve[i//3] += 1
|
||||
n -= 2
|
||||
i = (m - n) * (m + n)
|
||||
m += 1
|
||||
|
||||
print(sieve.count(target))
|
|
@ -0,0 +1,19 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
N = 50 * 10 ** 6
|
||||
target = 1
|
||||
|
||||
sieve = [0] * N
|
||||
|
||||
m = 3
|
||||
while 2*m - 1 < 3*N:
|
||||
n = m - 1 - (not m % 2)
|
||||
i = (m - n) * (m + n)
|
||||
while i < 3*N and n > 0:
|
||||
if not i % 3 and not (m - (n//2)) % 3:
|
||||
sieve[i//3] += 1
|
||||
n -= 2
|
||||
i = (m - n) * (m + n)
|
||||
m += 1
|
||||
|
||||
print(sieve.count(target))
|
|
@ -0,0 +1,31 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def sols():
|
||||
"""yields int solutions of a**2 - 5 b**2 = 1"""
|
||||
a, b = 9, 4
|
||||
while True:
|
||||
yield a, b
|
||||
a, b = 9*a + 20*b, 4*a + 9*b
|
||||
|
||||
def Cs():
|
||||
"""yields int solutions of a in a**2 - 5 b**2 = -4"""
|
||||
for a, b in sols():
|
||||
yield 25*b - 11*a
|
||||
yield 10*b - 4*a
|
||||
yield 5*b - a
|
||||
|
||||
gen = Cs()
|
||||
next(gen)
|
||||
count = 0
|
||||
|
||||
N = 15
|
||||
|
||||
while count < N:
|
||||
c = next(gen)
|
||||
if (c-1) % 5 != 0:
|
||||
continue
|
||||
count += 1
|
||||
|
||||
n = (c-1) // 5
|
||||
print(n)
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def sols(n):
|
||||
"""yields int solutions of a**2 - 5 b**2 = 1"""
|
||||
a, b = 9, 4
|
||||
for i in range(n):
|
||||
yield a, b
|
||||
a, b = 9*a + 20*b, 4*a + 9*b
|
||||
|
||||
N = 12
|
||||
|
||||
Ls = []
|
||||
|
||||
for a, b in sols(N // 2):
|
||||
a0, b0 = 5*b - 2*a, a - 2*b
|
||||
m0, n0 = 2*b0 + a0, b0
|
||||
m, n = 2*b + a, b
|
||||
Ls += [m0**2 + n0**2, m**2 + n**2]
|
||||
|
||||
print(sum(Ls))
|
|
@ -0,0 +1,36 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from math import gcd
|
||||
|
||||
def sols():
|
||||
"""yields solutions to a**2 - 2b**2 = -1"""
|
||||
a, b = 3, 2
|
||||
while True:
|
||||
yield 2*b - a, a - b
|
||||
a, b = 3*a + 4*b, 2*a + 3*b
|
||||
|
||||
|
||||
def mn_from_ab(a, b, sgn):
|
||||
M, N = a + b, b - sgn
|
||||
div = gcd(M, N)
|
||||
m, n = M // div, N // div
|
||||
return m, n
|
||||
|
||||
def gen_mn(N):
|
||||
for a, b in sols():
|
||||
if b > N//2:
|
||||
break
|
||||
yield mn_from_ab(a, b, 1)
|
||||
yield mn_from_ab(a, b, -1)
|
||||
|
||||
def is_primitive(m, n):
|
||||
return (m + n) % 2 == 1 and n != 0
|
||||
|
||||
def count_triangles(m, n, circ):
|
||||
sides = (m**2 - n**2, 2*m*n, m**2 + n**2)
|
||||
return (circ-1) // sum(sides)
|
||||
|
||||
N = 100 * 10**6
|
||||
|
||||
R = sum(count_triangles(m, n, N) for m, n in gen_mn(N) if is_primitive(m, n))
|
||||
print(R)
|
|
@ -0,0 +1,31 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def sols():
|
||||
"""yields int solutions of a**2 - 5 b**2 = 1"""
|
||||
a, b = 9, 4
|
||||
while True:
|
||||
yield a, b
|
||||
a, b = 9*a + 20*b, 4*a + 9*b
|
||||
|
||||
def cs():
|
||||
"""yields int solutions of a in a**2 - 5 b**2 = 44"""
|
||||
base_sols = [(7, 1), (8, 2), (13, 5), (17, 7), (32, 14), (43, 19)]
|
||||
base_sols.reverse()
|
||||
for a, b in sols():
|
||||
for a0, b0 in base_sols:
|
||||
yield a0 * a - 5 * b0 * b
|
||||
|
||||
|
||||
N = 30
|
||||
gen = cs()
|
||||
next(gen)
|
||||
|
||||
nuggs = []
|
||||
|
||||
while len(nuggs) < N:
|
||||
c = next(gen)
|
||||
if (c - 7) % 5 != 0:
|
||||
continue
|
||||
nuggs.append((c-7) // 5)
|
||||
|
||||
print(sum(nuggs))
|
|
@ -0,0 +1,29 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from math import gcd
|
||||
|
||||
def is_square(n):
|
||||
return int(n**0.5)**2 == n
|
||||
|
||||
def sol(p, q, n):
|
||||
return n*q * (p**3 * n + q)
|
||||
|
||||
N = 10**12
|
||||
a = 1
|
||||
r = 0
|
||||
|
||||
for p in range(2, int(N**(1.0/3))):
|
||||
for q in range(1, p):
|
||||
if p**3 * q + q**2 >= N:
|
||||
break
|
||||
if gcd(p, q) > 1:
|
||||
continue
|
||||
n = 1
|
||||
s = sol(p, q, n)
|
||||
while s < N:
|
||||
if is_square(s):
|
||||
r += s
|
||||
n += 1
|
||||
s = sol(p, q, n)
|
||||
|
||||
print(r)
|
|
@ -0,0 +1,41 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from math import sqrt
|
||||
from itertools import combinations
|
||||
|
||||
def is_square(n):
|
||||
return int(sqrt(n))**2 == n
|
||||
|
||||
zbound = 10**6
|
||||
|
||||
zs = [[] for i in range(zbound)]
|
||||
|
||||
c = 1
|
||||
while c - 2 < len(zs):
|
||||
d = c-2
|
||||
while d > 0 and (c**2 - d**2) // 2 < len(zs):
|
||||
zs[(c**2 - d**2) // 2].append((c**2 + d**2) // 2)
|
||||
d -= 2
|
||||
c += 1
|
||||
|
||||
max_z = None
|
||||
min_sum = None
|
||||
for z in range(1, len(zs)):
|
||||
if max_z != None and z > max_z:
|
||||
#print("found")
|
||||
break
|
||||
nums = sorted(zs[z])[::-1]
|
||||
if len(nums) < 2:
|
||||
continue
|
||||
|
||||
for cd, ef in combinations(nums, 2):
|
||||
if is_square(cd + ef) and is_square(cd - ef):
|
||||
x = cd
|
||||
y = ef
|
||||
#print(x, y, z)
|
||||
if min_sum == None or min_sum > x + y + z:
|
||||
min_sum = x + y + z
|
||||
if max_z == None or x < max_z:
|
||||
max_z = x
|
||||
|
||||
print(min_sum)
|
|
@ -0,0 +1,58 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from collections import defaultdict
|
||||
from math import gcd
|
||||
|
||||
def sols(N):
|
||||
"""yields solutions of x**2 + 3y**2 = z**2 where x + y <= 2N"""
|
||||
for l in range(1, N+1, 2):
|
||||
for k in range(1, N//l + 1, 2):
|
||||
if gcd(l, k) != 1:
|
||||
continue
|
||||
x = abs(3*l**2 - k**2) // 2
|
||||
y = l * k
|
||||
z = (3*l**2 + k**2) // 2
|
||||
for n in range(1, (2*N) // (x+y) + 1):
|
||||
yield (n*x, n*y, n*z)
|
||||
|
||||
for l in range(1, N//2 + 1):
|
||||
for k in range(1 + (l%2), N//(2*l) + 1, 2):
|
||||
if gcd(l, k) != 1:
|
||||
continue
|
||||
x = 2 * abs(3*l**2 - k**2)
|
||||
y = 4 * l * k
|
||||
z = 2 * (3*l**2 + k**2)
|
||||
if x + y > 2*N:
|
||||
continue
|
||||
for n in range(1, (2*N) // (x+y) + 1):
|
||||
yield (n*x, n*y, n*z)
|
||||
|
||||
def pq_gen(N):
|
||||
"""yields solutions of c**2 = p**2 + q**2 + pq where c is int and p + q <= N"""
|
||||
for x, y, z in sols(N):
|
||||
p = y
|
||||
if x <= p or (x - p) % 2 != 0:
|
||||
continue
|
||||
q = (x - p) // 2
|
||||
yield p, q
|
||||
|
||||
|
||||
def find_pqr(N):
|
||||
pqs = defaultdict(lambda : set())
|
||||
for p, q in pq_gen(N-1):
|
||||
pqs[p].add(q)
|
||||
pqs[q].add(p)
|
||||
sums = set()
|
||||
for p, qrs in dict(pqs).items():
|
||||
for q in qrs:
|
||||
for r in qrs:
|
||||
if p + q + r > N or r not in pqs[q]:
|
||||
continue
|
||||
sums.add(p + q + r)
|
||||
return sum(sums)
|
||||
|
||||
|
||||
N = 120 * 1000
|
||||
|
||||
print(find_pqr(N))
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from math import sqrt, pi
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
|
||||
class Ellipse:
|
||||
def __init__(self, a, b):
|
||||
self.a = float(a)
|
||||
self.b = float(b)
|
||||
|
||||
def normal(self, vec):
|
||||
x, y = vec
|
||||
return norm([self.b**2 * x, self.a**2 * y])
|
||||
|
||||
def quadratic(a, b, c):
|
||||
D = b**2 - 4*a*c
|
||||
if D < 0:
|
||||
return False
|
||||
r1 = (-b + sqrt(D)) / (2*a)
|
||||
r2 = (-b - sqrt(D)) / (2*a)
|
||||
return r1, r2
|
||||
|
||||
def norm(v):
|
||||
l = sqrt(sum(x**2 for x in v))
|
||||
return np.array([x/l for x in v])
|
||||
|
||||
def intersections(ellipse, point, dir):
|
||||
m = dir[1] / dir[0]
|
||||
yint = point[1] - point[0]*m
|
||||
|
||||
a = ellipse.a**2 * m**2 + ellipse.b**2
|
||||
b = 2 * ellipse.a**2 * m * yint
|
||||
c = ellipse.a**2 * (yint**2 - ellipse.b**2)
|
||||
|
||||
x1, x2 = quadratic(a, b, c)
|
||||
y1, y2 = m*x1 + yint, m*x2 + yint
|
||||
|
||||
return np.array([x1, y1]), np.array([x2, y2])
|
||||
|
||||
def reflect(ellipse, A, B):
|
||||
point = B
|
||||
dir = B - A
|
||||
n = ellipse.normal(point)
|
||||
ref = 2 * (n.dot(dir) * n - dir) + dir
|
||||
ps = intersections(ellipse, point, ref)
|
||||
return max(ps, key=lambda v: (B-v).dot(B-v))
|
||||
|
||||
def plot_ellipse(ellipse):
|
||||
t = np.linspace(0, 2*pi, 100)
|
||||
plt.plot(ellipse.a*np.cos(t), ellipse.b*np.sin(t))
|
||||
|
||||
ellipse = Ellipse(5, 10)
|
||||
A = np.array([0.0, 10.1])
|
||||
B = np.array([1.4, -9.6])
|
||||
x = 0.01
|
||||
|
||||
|
||||
plt.axis('equal')
|
||||
plot_ellipse(ellipse)
|
||||
|
||||
count = 0
|
||||
|
||||
while not (-x <= B[0] <= x and B[1] > 0):
|
||||
plt.plot(*zip(A, B))
|
||||
A, B = B, reflect(ellipse, A, B)
|
||||
count += 1
|
||||
|
||||
|
||||
plt.show()
|
||||
print(count)
|
|
@ -0,0 +1,16 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
# closed form expression, d = digits
|
||||
# if d is even: 20 * 30**(d/2 - 1)
|
||||
# if d = 3+4n : 5 * 20**((d+1)/4) * 25**((i-3)/4)
|
||||
# iterate all digits in range
|
||||
|
||||
def main(d): #inclusive
|
||||
r = 0
|
||||
for i in range(2,d+1,2):
|
||||
r += 20*30**(i//2 - 1)
|
||||
for i in range(3,d+1,4):
|
||||
r += 5 * 20**((i+1)//4) * 25**((i-3)//4)
|
||||
return r
|
||||
|
||||
print(main(9))
|
|
@ -0,0 +1,65 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from random import randint
|
||||
from operator import mul
|
||||
from functools import reduce
|
||||
|
||||
DEPTH = 5
|
||||
SEQ = [1, 3, 7, 9, 13, 27]
|
||||
NOTP = [5, 11, 15, 17, 19, 21, 23, 25]
|
||||
|
||||
|
||||
def is_prime(n, depth=DEPTH):
|
||||
r = 0
|
||||
d = n - 1
|
||||
while not d % 2:
|
||||
r += 1
|
||||
d //= 2
|
||||
for k in range(depth):
|
||||
a = randint(2, n - 2)
|
||||
x = pow(a, d, n)
|
||||
if x == 1 or x == n - 1:
|
||||
continue
|
||||
for i in range(r-1):
|
||||
x = pow(x, 2, n)
|
||||
if x == n-1:
|
||||
break
|
||||
else:
|
||||
return False
|
||||
return True
|
||||
|
||||
def test(m, nums):
|
||||
return all((m**2 + r) % n for n in nums for r in SEQ)
|
||||
|
||||
def getmod(nums):
|
||||
return [m for m in range(reduce(mul, nums)) if test(m, nums)]
|
||||
|
||||
def testseq(n):
|
||||
for s in SEQ:
|
||||
if not is_prime(n**2 + s):
|
||||
return False
|
||||
for s in NOTP:
|
||||
if is_prime(n**2 + s):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
nums = [2, 3, 5, 7, 11, 13, 17]
|
||||
|
||||
N = 150 * 10**6
|
||||
|
||||
n = 0
|
||||
mods = getmod(nums)
|
||||
step = reduce(mul, nums)
|
||||
|
||||
s = 0
|
||||
|
||||
while n < N:
|
||||
for m in mods:
|
||||
if n + m >= N:
|
||||
break
|
||||
if testseq(n+m):
|
||||
s += n + m
|
||||
n += step
|
||||
|
||||
print(s)
|
|
@ -0,0 +1,57 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
def search_row(row):
|
||||
row = [a for a in row]
|
||||
for i in range(1, len(row)):
|
||||
prev, val = row[i-1], row[i]
|
||||
row[i] = max(prev + val, val)
|
||||
return max(row)
|
||||
|
||||
def search_rows(grid):
|
||||
return max(search_row(row) for row in grid)
|
||||
|
||||
def search_diagonals(grid):
|
||||
ln = len(grid)
|
||||
m = 0
|
||||
for d in range(-ln + 1, ln):
|
||||
r = search_row([grid[i][i+d]
|
||||
for i in range(ln) if 0 <= i+d < ln])
|
||||
m = max(m, r)
|
||||
return m
|
||||
|
||||
def fib_gen(k, mem):
|
||||
if len(mem) > k and mem[k] != None:
|
||||
return mem[k]
|
||||
elif k < 56:
|
||||
s = 100003 - 200003*k + 300007*k**3
|
||||
s %= 1000000
|
||||
s -= 500000
|
||||
else:
|
||||
s = (fib_gen(k-24, mem) + fib_gen(k-55, mem) + 1000000) % 1000000
|
||||
s -= 500000
|
||||
mem += [None] * (k - len(mem) + 1)
|
||||
mem[k] = s
|
||||
return s
|
||||
|
||||
|
||||
grid2 = [[-2, 5, 3, 2],
|
||||
[9, -6, 5, 1],
|
||||
[3, 2, 7, 3],
|
||||
[-1, 8, -4, 8]]
|
||||
|
||||
mem = []
|
||||
|
||||
side = 2000
|
||||
|
||||
grid = [[0]*side for i in range(side)]
|
||||
|
||||
for ri in range(side):
|
||||
for ci in range(side):
|
||||
grid[ri][ci] = fib_gen(side*ri + ci + 1, mem)
|
||||
|
||||
rows = search_rows(grid)
|
||||
cols = search_rows(zip(*grid))
|
||||
dia1 = search_diagonals(grid)
|
||||
dia2 = search_diagonals([row[::-1] for row in grid])
|
||||
|
||||
print(max(rows, cols, dia1, dia2))
|
Loading…
Reference in New Issue