84 lines
1.7 KiB
Python
84 lines
1.7 KiB
Python
# Find the number d < 1000 for which 1 / d has the longest recurring cycle
|
|
# in its decimal fraction part
|
|
|
|
# It seems like the cycle is never longer than the longest of the cycle length of any of its prime divisors
|
|
# So say we want to know the length for d and d = a * b, then the cycle for d has the same length as either the cycle for a or b, whichever is longer.
|
|
|
|
# So it seems we then only have to check the primes, so first let's get a prime finder in here
|
|
|
|
import numpy as np
|
|
import math
|
|
|
|
def maxIndex(ns):
|
|
result = 0
|
|
m = ns[0]
|
|
|
|
for i in range(len(ns)):
|
|
if ns[i] > m:
|
|
result = i
|
|
m = ns[i]
|
|
|
|
return result
|
|
|
|
def getPrimes(n):
|
|
primes = [1 for p in range(n)]
|
|
primes[0] = 0
|
|
primes[1] = 0
|
|
|
|
x = 2
|
|
while x < np.sqrt(n):
|
|
if primes[x] == 1:
|
|
|
|
for i in range(x+x, n, x):
|
|
primes[i] = 0
|
|
|
|
x += 1
|
|
|
|
result = []
|
|
for i in range(n):
|
|
if primes[i]:
|
|
result.append(i)
|
|
|
|
return result
|
|
|
|
# Now we need to find out the recurring cycle length for any number
|
|
# As a benefit for only checking prime number, we know that the cycles will always immediately start after the .'s
|
|
|
|
def cycleLength(n):
|
|
l = int(math.log10(n)) + 1
|
|
y = 1
|
|
power = pow(10,l)
|
|
|
|
result = 1
|
|
|
|
while True:
|
|
|
|
x = (y * power) // n
|
|
rest = y * power - x * n
|
|
|
|
if rest == 0:
|
|
return 0
|
|
|
|
elif rest == 1:
|
|
break
|
|
|
|
else:
|
|
y = rest
|
|
|
|
result += 1
|
|
|
|
return result * l
|
|
|
|
def main():
|
|
print("Hello, this is Patrick")
|
|
|
|
ps = getPrimes(1000)
|
|
cyclelengths = [cycleLength(p) for p in ps]
|
|
|
|
for i in range(len(ps)):
|
|
print(f"{ps[i]} has length: {cyclelengths[i]}")
|
|
|
|
print(f"Biggest cycle is for {ps[maxIndex(cyclelengths)]} with length {max(cyclelengths)}")
|
|
|
|
if __name__ == "__main__":
|
|
main() |