Check Machin-like formulas: Difference between revisions
Content added Content deleted
(→Tcl: Added implementation) |
(Go solution) |
||
Line 30: | Line 30: | ||
You can store the equations in any convenient data structure, but for extra credit parse them from human-readable [[Check_Machin-like_formulas/text_equations|text input]]. |
You can store the equations in any convenient data structure, but for extra credit parse them from human-readable [[Check_Machin-like_formulas/text_equations|text input]]. |
||
=={{header|Go}}== |
|||
{{trans|Python}} |
|||
<lang go>package main |
|||
import ( |
|||
"fmt" |
|||
"math/big" |
|||
) |
|||
type mTerm struct { |
|||
a, n, d int64 |
|||
} |
|||
var testCases = [][]mTerm{ |
|||
{{1, 1, 2}, {1, 1, 3}}, |
|||
{{2, 1, 3}, {1, 1, 7}}, |
|||
{{4, 1, 5}, {-1, 1, 239}}, |
|||
{{5, 1, 7}, {2, 3, 79}}, |
|||
{{1, 1, 2}, {1, 1, 5}, {1, 1, 8}}, |
|||
{{4, 1, 5}, {-1, 1, 70}, {1, 1, 99}}, |
|||
{{5, 1, 7}, {4, 1, 53}, {2, 1, 4443}}, |
|||
{{6, 1, 8}, {2, 1, 57}, {1, 1, 239}}, |
|||
{{8, 1, 10}, {-1, 1, 239}, {-4, 1, 515}}, |
|||
{{12, 1, 18}, {8, 1, 57}, {-5, 1, 239}}, |
|||
{{16, 1, 21}, {3, 1, 239}, {4, 3, 1042}}, |
|||
{{22, 1, 28}, {2, 1, 443}, {-5, 1, 1393}, {-10, 1, 11018}}, |
|||
{{22, 1, 38}, {17, 7, 601}, {10, 7, 8149}}, |
|||
{{44, 1, 57}, {7, 1, 239}, {-12, 1, 682}, {24, 1, 12943}}, |
|||
{{88, 1, 172}, {51, 1, 239}, {32, 1, 682}, {44, 1, 5357}, {68, 1, 12943}}, |
|||
{{88, 1, 172}, {51, 1, 239}, {32, 1, 682}, {44, 1, 5357}, {68, 1, 12944}}, |
|||
} |
|||
func main() { |
|||
for _, m := range testCases { |
|||
fmt.Printf("tan %v = %v\n", m, tans(m)) |
|||
} |
|||
} |
|||
var one = big.NewRat(1, 1) |
|||
func tans(m []mTerm) *big.Rat { |
|||
if len(m) == 1 { |
|||
return tanEval(m[0].a, big.NewRat(m[0].n, m[0].d)) |
|||
} |
|||
half := len(m) / 2 |
|||
a := tans(m[:half]) |
|||
b := tans(m[half:]) |
|||
r := new(big.Rat) |
|||
return r.Quo(new(big.Rat).Add(a, b), r.Sub(one, r.Mul(a, b))) |
|||
} |
|||
func tanEval(coef int64, f *big.Rat) *big.Rat { |
|||
if coef == 1 { |
|||
return f |
|||
} |
|||
if coef < 0 { |
|||
r := tanEval(-coef, f) |
|||
return r.Neg(r) |
|||
} |
|||
ca := coef / 2 |
|||
cb := coef - ca |
|||
a := tanEval(ca, f) |
|||
b := tanEval(cb, f) |
|||
r := new(big.Rat) |
|||
return r.Quo(new(big.Rat).Add(a, b), r.Sub(one, r.Mul(a, b))) |
|||
}</lang> |
|||
{{out}} |
|||
Last line edited to show only most significant digits of fraction which is near, but not exactly equal to 1. |
|||
<pre> |
|||
tan [{1 1 2} {1 1 3}] = 1/1 |
|||
tan [{2 1 3} {1 1 7}] = 1/1 |
|||
tan [{4 1 5} {-1 1 239}] = 1/1 |
|||
tan [{5 1 7} {2 3 79}] = 1/1 |
|||
tan [{1 1 2} {1 1 5} {1 1 8}] = 1/1 |
|||
tan [{4 1 5} {-1 1 70} {1 1 99}] = 1/1 |
|||
tan [{5 1 7} {4 1 53} {2 1 4443}] = 1/1 |
|||
tan [{6 1 8} {2 1 57} {1 1 239}] = 1/1 |
|||
tan [{8 1 10} {-1 1 239} {-4 1 515}] = 1/1 |
|||
tan [{12 1 18} {8 1 57} {-5 1 239}] = 1/1 |
|||
tan [{16 1 21} {3 1 239} {4 3 1042}] = 1/1 |
|||
tan [{22 1 28} {2 1 443} {-5 1 1393} {-10 1 11018}] = 1/1 |
|||
tan [{22 1 38} {17 7 601} {10 7 8149}] = 1/1 |
|||
tan [{44 1 57} {7 1 239} {-12 1 682} {24 1 12943}] = 1/1 |
|||
tan [{88 1 172} {51 1 239} {32 1 682} {44 1 5357} {68 1 12943}] = 1/1 |
|||
tan [{88 1 172} {51 1 239} {32 1 682} {44 1 5357} {68 1 12944}] = |
|||
100928801... / |
|||
100928883... |
|||
</pre> |
|||
=={{header|Haskell}}== |
=={{header|Haskell}}== |