diff --git a/cmd/convergents.go b/cmd/convergents.go new file mode 100644 index 0000000..3daa8e8 --- /dev/null +++ b/cmd/convergents.go @@ -0,0 +1,98 @@ +/* +Copyright © 2025 filifa + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +package cmd + +import ( + "fmt" + "log" + "math/big" + + "github.com/spf13/cobra" +) + +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 { + log.Fatal("invalid input " + args[0]) + } + + denoms := make([]big.Int, len(args[1:])) + for i, d := range args[1:] { + _, ok = denoms[i].SetString(d, 10) + if !ok { + log.Fatal("invalid input " + d) + } + } + + tmp := new(big.Int) + tmp.Mul(a0, h) + tmp.Add(tmp, hprev) + hprev.Set(h) + h.Set(tmp) + + tmp.Mul(a0, k) + tmp.Add(tmp, kprev) + kprev.Set(k) + k.Set(tmp) + + fmt.Println(h, k) + + for i := 0; true; i = (i + 1) % len(denoms) { + a := &denoms[i] + + tmp.Mul(a, h) + tmp.Add(tmp, hprev) + hprev.Set(h) + h.Set(tmp) + + tmp.Mul(a, k) + tmp.Add(tmp, kprev) + kprev.Set(k) + k.Set(tmp) + + fmt.Println(h, k) + } +} + +// convergentsCmd represents the convergents command +var convergentsCmd = &cobra.Command{ + Use: "convergents N N [N ...]", + Short: "Compute convergents of a periodic continued fraction", + Long: `Compute convergents of a periodic continued fraction.`, + Args: cobra.MinimumNArgs(2), + Run: convergents, +} + +func init() { + rootCmd.AddCommand(convergentsCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // convergentsCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // convergentsCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +}