From e4bd9aa661c8aae8362f8e9f6c61df7aea49b392 Mon Sep 17 00:00:00 2001 From: filifa Date: Fri, 5 Sep 2025 21:23:25 -0400 Subject: [PATCH] return channels --- cmd/convergents.go | 44 +++++++++++++++++++++++++------------------- cmd/pell.go | 6 ++---- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/cmd/convergents.go b/cmd/convergents.go index b7cf9d1..7d5cd35 100644 --- a/cmd/convergents.go +++ b/cmd/convergents.go @@ -23,24 +23,32 @@ import ( "github.com/spf13/cobra" ) -func cycle(seq []*big.Int, ch chan<- *big.Int) { +func cycle(seq []*big.Int) chan *big.Int { + ch := make(chan *big.Int) n := len(seq) - for i := 0; true; i = (i + 1) % n { - ch <- seq[i] - } + go func() { + for i := 0; true; i = (i + 1) % n { + ch <- seq[i] + } + }() + + return ch } -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 gaussianBrackets(x, xprev *big.Int, ch chan *big.Int) chan *big.Int { + out := make(chan *big.Int) + + go func() { + for a := range ch { + tmp := new(big.Int).Mul(a, x) + tmp.Add(tmp, xprev) + xprev.Set(x) + x.Set(tmp) + out <- tmp + } + }() + + return out } func convergents(cmd *cobra.Command, args []string) { @@ -58,10 +66,8 @@ func convergents(cmd *cobra.Command, args []string) { } } - 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) + hch := gaussianBrackets(a0, big.NewInt(1), cycle(denoms)) + kch := gaussianBrackets(big.NewInt(1), big.NewInt(0), cycle(denoms)) r := new(big.Rat) for { diff --git a/cmd/pell.go b/cmd/pell.go index f0c4e08..ca92fbe 100644 --- a/cmd/pell.go +++ b/cmd/pell.go @@ -39,10 +39,8 @@ func pell(cmd *cobra.Command, args []string) { cobra.CheckErr(pellCoeff + " is a perfect square") } - 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) + hch := gaussianBrackets(a0, big.NewInt(1), cycle(repetend)) + kch := gaussianBrackets(big.NewInt(1), big.NewInt(0), cycle(repetend)) for { h, k := <-hch, <-kch