Rappresentazione decimale e rappresentazione binaria dei numeri razionali

Riferimento:
G.C. Barozzi: Primo Corso di Analisi Matematica
Zanichelli (Bologna), 1998, ISBN 88-08-01169-0, Laboratorio 1.2-2 e Laboratorio A.4-2

Viene calcolatala rappresentazione decimale del numero razonale p/q, con p e q entrambi positivi. Le cifre dell'antiperiodo sono separate da quelle del periodo da una barra.

\(rd[p_, q_] := 
\ 	
      Module[{\ r\  = \ Mod[p, q], \ c\  = \ Quotient[p, q], \ k\  = \ 0, \ 

          \ \ 					cifre\  = \ {}, \ q0, \ lunAp, \ lunPe\  = \ 0, \ 
          stampa}, \ 
\ \ 
        lunAp\  = \ Length[FixedPointList[\((GCD[10\ #, \ q])\)&, \ 1]] - 2; 
        
\ \ \ \ \  (*\ lunghezza\ dell' antiperiodo\ *) 
\ \ 	
        q0\  = \ q/GCD[q, 10^lunAp]; \ 
\ \ 	
        If[q0\  > \ 1, 
\ \ 	\ 	k\  = \ 1; \ 
          While[Mod[10^k, q0] != 1, \ \(k++\)]; 
\ \ \ \ \ lunPe\  = \ k; 
          \ \  (*\ lunghezza\ del\ periodo\ *) 
\ \ 	]; \ 
\ \ 	
        stampa\  = \ ToString[c]\ <>\ "."; 				
\ \ 	
        Do[c\  = \ Quotient[10\ r, q]; \ 
\ \ 	\ \ 	\ 
          r\  = \ Mod[10\ r, q]; \ 
\ \ 	\ \ \ \ \ 
          AppendTo[cifre, \ ToString[c]], 
\ \ 		\ \ {lunAp + lunPe}

          \ \ \ \ ]; 
\ \ \ \ \ 
        stampa\  = \ 
          stampa\ <>\ StringJoin[Take[cifre, \ lunAp]]\ 

            \ \ 	\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ <>\ 
            "/"\ <>\ StringJoin[Drop[cifre, \ lunAp]]; 						

        \ \ 	stampa
\ ]\)

Esempi:

rd[1, 8]

rd[1, 7]

rd[1, 28]

rd[1, 17]

rd[1, 113]

La funzione seguente determina la rappresentazione binaria del numero razionale p/q. Suggerioamo di scegliere frazioni proprie (p < q). In caso contrario, la parte intera è scritta in base 10, la parte frazionaria in base due.

\(\(
rbin[p_, q_] := 

      Module[{\ r\  = \ Mod[p, q], \ c\  = \ Quotient[p, q], \ k\  = \ 0, \ 

          \ \ \ \ \ cifre\  = \ {}, \ q0, \ lunAp, \ lunPe\  = \ 0, \ 
          stampa}, \ 
	\ 
        lunAp\  = \ Length[FixedPointList[\((GCD[2\ #, \ q])\)&, \ 1]] - 2; 

        \ \  (*\ lunghezza\ dell' antiperiodo\ *) 
\ \ \ 
        q0\  = \ q/GCD[q, 2^lunAp]; \ 
	
        If[q0\  > \ 1, 
	\ \ \ \ \ \ \ \ k\  = \ 1; \ 
          While[Mod[2^k, q0] != 1, \ \(k++\)]; 
\ \ \ \ \ \ \ \ \ \ 
          lunPe\  = \ k; \ \  (*\ lunghezza\ del\ periodo\ *) 
\ ]; 
	
        stampa\  = \ ToString[c]\ <>\ "."; 				
	
        Do[c\  = \ Quotient[2\ r, q]; \ 
	\ \ \ \ 	r\  = \ Mod[2\ r, q]; \ 
          
	\ \ \ \ \ \ \ AppendTo[cifre, \ ToString[c]], 

          		{lunAp + lunPe}
\ ]; 

        stampa\  = \ 
          stampa\ <>\ StringJoin[Take[cifre, \ lunAp]]\ 

            \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ <>\ "/"\ <>\ 
            StringJoin[Drop[cifre, \ lunAp]]; 						
	stampa
]\)\)

Esempi:

rbin[1, 5]

rbin[1, 10]

rbin[1, 7]

rbin[11, 5]