From 5585e6d00ef48481e03e63a75c248b72e7ace9ed Mon Sep 17 00:00:00 2001 From: filifa Date: Wed, 13 Aug 2025 22:17:01 -0400 Subject: [PATCH] add jacobi subcommand --- cmd/jacobi.go | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 cmd/jacobi.go diff --git a/cmd/jacobi.go b/cmd/jacobi.go new file mode 100644 index 0000000..7978bd2 --- /dev/null +++ b/cmd/jacobi.go @@ -0,0 +1,76 @@ +/* +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" +) + +var a string +var n string + +func jacobi(cmd *cobra.Command, args []string) { + x, ok := new(big.Int).SetString(a, 10) + if !ok { + log.Fatal("invalid input " + a) + } + + y, ok := new(big.Int).SetString(n, 10) + if !ok { + log.Fatal("invalid input " + n) + } + + mod := big.NewInt(2) + mod.Mod(y, mod) + if mod.Cmp(big.NewInt(0)) == 0 { + log.Fatal("modulus must be odd") + } + + z := big.Jacobi(x, y) + fmt.Println(z) +} + +// jacobiCmd represents the jacobi command +var jacobiCmd = &cobra.Command{ + Use: "jacobi -a A -n N", + Short: "Compute the Jacobi symbol", + Long: `Compute the Jacobi symbol (a | n).`, + Run: jacobi, +} + +func init() { + rootCmd.AddCommand(jacobiCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // jacobiCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // jacobiCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") + + jacobiCmd.Flags().StringVarP(&a, "residue", "a", "", "residue") + jacobiCmd.MarkFlagRequired("residue") + jacobiCmd.Flags().StringVarP(&n, "modulus", "n", "", "modulus") + jacobiCmd.MarkFlagRequired("modulus") +}