Continued fraction: Difference between revisions
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
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)
- 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
- 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.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147
- 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))
- 2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992181741359662904357290033429526059563073813232862794349076323382988075319525101901
- 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))
- 3.1415926532</lang>