Problem 26 : Reciprocal cycles

Problem Statement

A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:

\[1/2 = 0.5 \\ 1/3 = 0.(3) \\ 1/4 = 0.25 \\ 1/5 = 0.2 \\ 1/6 = 0.1(6) \\ 1/7 = 0.(142857) \\ 1/8 = 0.125 \\ 1/9 = 0.(1) \\ 1/10 = 0.1 \\\]

Where 0.1(6) means 0.166666…, and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle.

Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part.

Solution

def divide(n,d,p):
    i = 0 
    remainders = set() 
    
    while i < p:
        if n < d:
            n = n * 10 
        
        n = n % d 
        if n in remainders: 
            return(d,i) 
        else:
            remainders.add(n) 
        
        i = i + 1 
    
longest = [0,0]
largest_denominator = 1000
for x in range(2,largest_denominator + 1):
  y = divide(1,x,x) 
  if y[1] > longest[1]:
    longest = y
print(longest[0])

Output

983