A friend chooses two 55 digit positive integers with no common factors and divides one by the other, telling you the result to 1212 significant digits. How can you find out what the two numbers were?

2 Answers
Nov 10, 2016

See below.

Explanation:

This problem has a "brute force" solution, using an optimization procedure.

Supose we know ff a 1212 digit precission associated to a fraction n/mnm with n,mn,m two 55 digit integer numbers. So

n=sum_(k=0)^4 a_k 10^kn=4k=0ak10k and
m=sum_(k=0)^4 b_k 10^km=4k=0bk10k

Defining now

e=n-f cdot me=nfm we can formulate a Linear Programming model with integer restrictions, that could conveniently minimize the objetive function lambda_s-lambda_iλsλi such that

S_(lambda)={mu_ile lambda_i le e le lambda_sle mu_s}Sλ={μiλieλsμs}

with the integer restrictions

S_a = {0 le a_k le 9Sa={0ak9 for k = 0,1,2,3k=0,1,2,3 and 1 le a_4 le 9}1a49} and a_k in NN
S_b = {0 le b_k le 9 for k = 0,1,2,3 and 1 le b_4 le 9} and b_k in NN

The final model is

min lambda_s-lambda_i

subjected to

S = S_(lambda) nn S_a nn S_b

Here mu_i and mu_s are margins with the purpose of precision enhancement. Have in mind that Integer programming is not convex programming. Typical values for mu_i and mu_s are -10^(-4) and 10^(-4) respectively.

Follow some samples:

1) Given f = 0.764003200360 the procedure obtained
n=13367
m=17496

2) Given f = 5.83081793383 the procedure obtained
n=79200
m=13583

2) Given f=3.14159265359 the procedure obtained
n=92988
m=29599

Nov 10, 2016

Use continued fractions...

Explanation:

If the quotient was known exactly then we could recover the original numerator and denominator by calculating the continued fraction, which would terminate, then simplifying.

As it is, we know the quotient to 12 significant digits, which should be enough. We just have to recognise when we have encountered the rounding error introduced by the 12 significant figure approximation...

Given the quotient, calculate the continued fraction as follows:

  • Write down the integer part and subtract it.

  • If the result is zero (or near enough) then stop.

  • Otherwise take the reciprocal and repeat.

The sequence of numbers written down form the coefficients of the continued fraction.

For example, suppose your friend told you that the quotient was: 0.357132525241 to 12 significant digits.

Following the steps above:

  • Write down the integer part color(blue)(0) and subtract it to give: 0.357132525241

  • Take the reciprocal to give: 2.80008100445

  • Write down the integer part color(blue)(2) and subtract it to give: 0.80008100445

  • Take the reciprocal to give: 1.24987344336

  • Write down the integer part color(blue)(1) and subtract it to give: 0.24987344336

  • Take the reciprocal to give: 4.00202593182

  • Write down the integer part color(blue)(4) and subtract it to give: 0.00202593182

  • Take the reciprocal to give: 493.600026480 (looks like we're getting warm)

  • Write down the integer part color(blue)(493) and subtract it to give: 0.600026480

  • Take the reciprocal to give: 1.66659311436

  • Write down the integer part color(blue)(1) and subtract it to give: 0.66659311436

  • Take the reciprocal to give: 1.50016551095

  • Write down the integer part color(blue)(1) and subtract it to give: 0.50016551095

  • Take the reciprocal to give: 1.99933817528

  • That's pretty close to our final integer color(blue)(2)

Taking the integers we have written down, we get the continued fraction:

""[color(blue)(0); color(blue)(2), color(blue)(1), color(blue)(4), color(blue)(493), color(blue)(1), color(blue)(1), color(blue)(2)] = color(blue)(0) + 1/(color(blue)(2) + 1/(color(blue)(1) + 1/(color(blue)(4) + 1/(color(blue)(493) + 1/(color(blue)(1) + 1/(color(blue)(1) + 1/color(blue)(2)))))))

color(white)(""[0; 2, 1, 4, 493, 1, 1, 2]) = 0+1/(2+1/(1+1/(4+1/(493+1 /(1+2/3)))))

color(white)(""[0; 2, 1, 4, 493, 1, 1, 2]) = 0+1/(2+1/(1+1/(4+1/(493+3/5))))

color(white)(""[0; 2, 1, 4, 493, 1, 1, 2]) = 0+1/(2+1/(1+1/(4+5/2468)))

color(white)(""[0; 2, 1, 4, 493, 1, 1, 2]) = 0+1/(2+1/(1+2468/9877))

color(white)(""[0; 2, 1, 4, 493, 1, 1, 2]) = 0+1/(2+9877/12345)

color(white)(""[0; 2, 1, 4, 493, 1, 1, 2]) = 0+12345/34567

color(white)(""[0; 2, 1, 4, 493, 1, 1, 2]) = 12345/34567

So the original two 5 digit numbers were 12345 and 34567.