diff --git a/cmd/convergents.go b/cmd/convergents.go index b417a5b..c5863ef 100644 --- a/cmd/convergents.go +++ b/cmd/convergents.go @@ -23,45 +23,49 @@ import ( "github.com/spf13/cobra" ) -func gaussianBrackets(x, xprev, a *big.Int) { - tmp := new(big.Int) - tmp.Mul(a, x) - tmp.Add(tmp, xprev) - xprev.Set(x) - x.Set(tmp) +func cycle(seq []*big.Int, ch chan *big.Int) { + n := len(seq) + for i := 0; true; i = (i + 1) % n { + ch <- seq[i] + } +} + +func gaussianBrackets(x, xprev *big.Int, seq []*big.Int, ch chan *big.Int) { + c := make(chan *big.Int) + go cycle(seq, c) + for a := range c { + tmp := new(big.Int) + tmp.Mul(a, x) + tmp.Add(tmp, xprev) + xprev.Set(x) + x.Set(tmp) + ch <- tmp + } } func convergents(cmd *cobra.Command, args []string) { - hprev := big.NewInt(0) - kprev := big.NewInt(1) - - h := big.NewInt(1) - k := big.NewInt(0) - a0, ok := new(big.Int).SetString(args[0], 10) if !ok { cobra.CheckErr("invalid input " + args[0]) } - denoms := make([]big.Int, len(args[1:])) + denoms := make([]*big.Int, len(args[1:])) for i, d := range args[1:] { - _, ok = denoms[i].SetString(d, 10) + denoms[i] = new(big.Int) + _, ok := denoms[i].SetString(d, 10) if !ok { cobra.CheckErr("invalid input " + d) } } - gaussianBrackets(h, hprev, a0) - gaussianBrackets(k, kprev, a0) - - r := new(big.Rat).SetFrac(h, k) - fmt.Println(r) - - for i := 0; true; i = (i + 1) % len(denoms) { - a := &denoms[i] - gaussianBrackets(h, hprev, a) - gaussianBrackets(k, kprev, a) + hch := make(chan *big.Int) + kch := make(chan *big.Int) + go gaussianBrackets(a0, big.NewInt(1), denoms, hch) + go gaussianBrackets(big.NewInt(1), big.NewInt(0), denoms, kch) + r := new(big.Rat) + for { + h, k := <-hch, <-kch r.SetFrac(h, k) fmt.Println(r) } diff --git a/cmd/pell.go b/cmd/pell.go index 71e6885..f0c4e08 100644 --- a/cmd/pell.go +++ b/cmd/pell.go @@ -39,16 +39,13 @@ func pell(cmd *cobra.Command, args []string) { cobra.CheckErr(pellCoeff + " is a perfect square") } - hprev := big.NewInt(0) - kprev := big.NewInt(1) + hch := make(chan *big.Int) + kch := make(chan *big.Int) + go gaussianBrackets(a0, big.NewInt(1), repetend, hch) + go gaussianBrackets(big.NewInt(1), big.NewInt(0), repetend, kch) - h := big.NewInt(1) - k := big.NewInt(0) - - gaussianBrackets(h, hprev, a0) - gaussianBrackets(k, kprev, a0) - - for i := 0; true; i = (i + 1) % len(repetend) { + for { + h, k := <-hch, <-kch foo := new(big.Int).Exp(k, big.NewInt(2), nil) foo.Mul(d, foo) @@ -58,10 +55,6 @@ func pell(cmd *cobra.Command, args []string) { if bar.Cmp(big.NewInt(1)) == 0 { fmt.Println(h, k) } - - a := repetend[i] - gaussianBrackets(h, hprev, a) - gaussianBrackets(k, kprev, a) } }