Continued fraction: Difference between revisions

From Rosetta Code
Content added Content deleted
m (moved Continued Fraction to Continued fractions: capitalization policy)
(Go solution)
Line 11: Line 11:


For Pi, <math>a_1</math> is 3 then <math>a_N</math> is always <math>6</math>. <math>b_N</math> is <math>(2N-1)^2</math>.
For Pi, <math>a_1</math> is 3 then <math>a_N</math> is always <math>6</math>. <math>b_N</math> is <math>(2N-1)^2</math>.

=={{header|Go}}==
<lang go>package main

import "fmt"

type cfTerm struct {
a, b int
}

// follows subscript convention of mathworld and WP where there is no b(0).
// cf[0].b is unused in this representation.
type cf []cfTerm

func cfSqrt2(nTerms int) cf {
f := make(cf, nTerms)
for n := range f {
f[n] = cfTerm{2, 1}
}
f[0].a = 1
return f
}

func cfNap(nTerms int) cf {
f := make(cf, nTerms)
for n := range f {
f[n] = cfTerm{n, n - 1}
}
f[0].a = 2
f[1].b = 1
return f
}

func cfPi(nTerms int) cf {
f := make(cf, nTerms)
for n := range f {
g := 2*n - 1
f[n] = cfTerm{6, g * g}
}
f[0].a = 3
return f
}

func (f cf) real() (r float64) {
for n := len(f) - 1; n > 0; n-- {
r = float64(f[n].b) / (float64(f[n].a) + r)
}
return r + float64(f[0].a)
}

func main() {
fmt.Println("sqrt2:", cfSqrt2(20).real())
fmt.Println("nap: ", cfNap(20).real())
fmt.Println("pi: ", cfPi(20).real())
}</lang>
{{out}}
<pre>
sqrt2: 1.4142135623730965
nap: 2.7182818284590455
pi: 3.141623806667839
</pre>


=={{header|Python}}==
=={{header|Python}}==

Revision as of 21:34, 27 February 2012

Continued fraction is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

A number may be represented as a continued fraction (see Mathworld for more information) as follows:

The task is to write a program which generates such a number and prints a real representation of it. The code should be tested by calculating and printing the square root of 2, Napier's Constant, and Pi.

For the square root of 2, is always . is then is .

For Napier's Constant, is , then is . is then is .

For Pi, is 3 then is always . is .

Go

<lang go>package main

import "fmt"

type cfTerm struct {

   a, b int

}

// follows subscript convention of mathworld and WP where there is no b(0). // cf[0].b is unused in this representation. type cf []cfTerm

func cfSqrt2(nTerms int) cf {

   f := make(cf, nTerms)
   for n := range f {
       f[n] = cfTerm{2, 1}
   }
   f[0].a = 1
   return f

}

func cfNap(nTerms int) cf {

   f := make(cf, nTerms)
   for n := range f {
       f[n] = cfTerm{n, n - 1}
   }
   f[0].a = 2
   f[1].b = 1
   return f

}

func cfPi(nTerms int) cf {

   f := make(cf, nTerms)
   for n := range f {
       g := 2*n - 1
       f[n] = cfTerm{6, g * g}
   }
   f[0].a = 3
   return f

}

func (f cf) real() (r float64) {

   for n := len(f) - 1; n > 0; n-- {
       r = float64(f[n].b) / (float64(f[n].a) + r)
   }
   return r + float64(f[0].a)

}

func main() {

   fmt.Println("sqrt2:", cfSqrt2(20).real())
   fmt.Println("nap:  ", cfNap(20).real())
   fmt.Println("pi:   ", cfPi(20).real())

}</lang>

Output:
sqrt2: 1.4142135623730965
nap:   2.7182818284590455
pi:    3.141623806667839

Python

<lang python># The continued Fraction def CF(a, b, t):

 if 0 < t:
   a1 = next(a)
   b1 = next(b)
   z  = CF(a, b, t-1)
   return (a1*z[0] + b1*z[1], z[0])
 return (1,1)
  1. Convert the continued fraction to a string

def pRes(cf, d):

 res = str(cf[0] // cf[1])
 res += "."
 x = cf[0] % cf[1]
 while 0 < d:
   x *= 10
   res += str(x // cf[1])
   x = x % cf[1]
   d -= 1
 return res
  1. Test the Continued Fraction for sqrt2

def sqrt2_a():

 yield 1
 while (True):
   yield 2

def sqrt2_b():

 while (True):
   yield 1

cf = CF(sqrt2_a(), sqrt2_b(), 950) print(pRes(cf, 200))

  1. 1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147


  1. Test the Continued Fraction for Napier's Constant

def Napier_a():

 yield 2
 n = 1
 while (True):
   yield n
   n += 1

def Napier_b():

 n=1
 yield n
 while (True):
   yield n
   n += 1

cf = CF(Napier_a(), Napier_b(), 950) print(pRes(cf, 200))

  1. 2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992181741359662904357290033429526059563073813232862794349076323382988075319525101901
  1. Test the Continued Fraction for Pi

def Pi_a():

 yield 3
 while (True):
   yield 6

def Pi_b():

 x = 1
 while (True):
   yield x*x
   x += 2

cf = CF(Pi_a(), Pi_b(), 950) print(pRes(cf, 10))

  1. 3.1415926532</lang>