2

For simple fraction, we can easily convert it to repeating decimal by calculator. Ex. $\frac 1 3 = 0.33333\ldots$, $\frac 1 7=0.(142857),\ldots$ But some fraction fraction like $10/29, 1/97,...$ The repeating part of them are too long, so it can't fully show on the calculator. So is there any algorithm to find the repeating part for that fraction?

Klangen
  • 5,075
T.Nhan
  • 173

3 Answers3

1

Yes, there is. This wikipedia page explains the various algorithms in the Section "Converting repeating decimals to fractions".

Klangen
  • 5,075
0

Yes. Here is one I once wrote in the R language. It uses the 'gmp' (GNU Multiple Precision) package.

#########################################################
### Functions for converting back and forth between   ###
### rational numbers and decimals. Repeating decimals ###
### are denoted by brackets around the digit block    ###
### repeats. For example, 11/6 is 1.8[3] in decimal.  ###
#########################################################

#############################

Author: Roman Chokler

############################# library(gmp)

bigq.to.dec <- function(q) { sgn <- sign(q) num <- abs(numerator(q)) den <- denominator(q) d <- den c2 <- 0 c5 <- 0 while(d %% 2==0) { d <- as.bigz(d/2) c2 <- c2 + 1 } while(d %% 5==0) { d <- as.bigz(d/5) c5 <- c5 + 1 } transient <- max(c2,c5) dec <- as.character(as.bigz(num/den)) rem <- num %% den if (rem != 0) { dec <- paste0(dec,".") if (transient>0) { for(i in 1:transient) { rem <- rem * 10 dec <- paste0(dec,as.bigz(rem/den)) rem <- rem %% den } } if (rem != 0) { dec <- paste0(dec,"[") r <- rem rem <- rem * 10 dec <- paste0(dec,as.bigz(rem/den)) rem <- rem %% den while (rem != r) { rem <- rem * 10 dec <- paste0(dec,as.bigz(rem/den)) rem <- rem %% den } dec <- paste0(dec,"]") } } if (sgn == -1) { dec <- paste0("-",dec) } return(dec) }

dec.to.bigq <- function(dec) { bq <- 0 sgn <- 1 n <- nchar(dec) if (regexpr("-",dec)[1]==1) { sgn <- -1 dec <- substr(dec,2,n) n <- n - 1 } pnt <- regexpr("\.",dec)[1] rstart <- regexpr("\[",dec)[1] rend <- regexpr("\]",dec)[1] if (pnt == -1) { return(as.bigq(dec) * sgn) } if (n==pnt) { return((as.bigq(substr(dec,1,pnt-1))) * sgn) } bq <- as.bigq(substr(dec,1,pnt-1)) if (rstart == -1) { transient <- substr(dec,pnt+1,n) den <- pow.bigz(10,nchar(transient)) transient <- sub("^0+","",transient) if (transient == "") { transient <- "0" } return((bq + div.bigq(transient,den)) * sgn) } den <- as.bigz(1) if (rstart > pnt + 1) { transient <- substr(dec,pnt+1,rstart-1) den <- pow.bigz(10,nchar(transient)) transient <- sub("^0+","",transient) if (transient == "") { transient <- "0" } bq <- bq + div.bigq(transient,den) } if ((rend == -1) || (rstart >= rend - 1) || n > rend) { return(as.bigq(NA)) } rep <- substr(dec,rstart+1,rend-1) den <- den * (pow.bigz(10,nchar(rep)) - 1) rep <- sub("^0+","",rep) if (rep == "") { rep <- "0" } return((bq + div.bigq(rep,den)) * sgn) }

0

For, say, $\large \frac{1}{97}$, start by running the Python program

R = []

numer = 1 denom = 97

for i in range(0,denom): r = numer * 10**i % denom try: ndx = R.index(r) except: ndx = -1 if ndx >= 0: print(i,ndx) break R.append(r)

The output of the program is

96 0

The period length is

i - ndx

and is therefore equal to $96 - 0 = 96$.

The offset (to the right of the decimal) is $0$ so the period begins immediately after the decimal.

So we need to put a bar over the first $96$ digits.

To get those decimal digits you can conveniently use wolfram, and compute

integerPart((1 + 1/97) * 10^96)

The output is

1010309278350515463917525773195876288659793814432989690721649484536082474226804123711340206185567

and you have to drop the leading $1$ (used to 'light up' any zeroes right after the decimal point) to get the final answer (with period broken down into blocks of $25$),

$\quad \large \frac{1}{97} =$

$0.\overline{0103092783505154639175257}$
$\; \; \, \overline{7319587628865979381443298}$
$\; \; \, \overline{9690721649484536082474226}$
$\; \; \, \overline{804123711340206185567}$

CopyPasteIt
  • 11,366