/* 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") }