diff --git a/cmd/multiplicativeOrder.go b/cmd/multiplicativeOrder.go new file mode 100644 index 0000000..a47a5b1 --- /dev/null +++ b/cmd/multiplicativeOrder.go @@ -0,0 +1,70 @@ +/* +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" + "math/big" + + "github.com/spf13/cobra" + "scm.dairydemon.net/filifa/mathtools/internal/lib" +) + +var multiplicativeOrderBase string +var multiplicativeOrderModulus string + +func multiplicativeOrder(cmd *cobra.Command, args []string) { + g, ok := new(big.Int).SetString(multiplicativeOrderBase, 10) + if !ok { + cobra.CheckErr("invalid base " + multiplicativeOrderBase) + } + + m, ok := new(big.Int).SetString(multiplicativeOrderModulus, 10) + if !ok { + cobra.CheckErr("invalid modulus " + multiplicativeOrderModulus) + } + + k := lib.MultiplicativeOrder(g, m) + fmt.Println(k) +} + +// multiplicativeOrderCmd represents the multiplicativeOrder command +var multiplicativeOrderCmd = &cobra.Command{ + Use: "multiplicative-order", + Short: "Compute multiplicative order", + Long: `Compute the multiplicative order of a number given a modulus.`, + Run: multiplicativeOrder, +} + +func init() { + rootCmd.AddCommand(multiplicativeOrderCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // multiplicativeOrderCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // multiplicativeOrderCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") + multiplicativeOrderCmd.Flags().StringVarP(&multiplicativeOrderBase, "base", "g", "", "base") + multiplicativeOrderCmd.Flags().StringVarP(&multiplicativeOrderModulus, "modulus", "m", "", "modulus") + + multiplicativeOrderCmd.MarkFlagRequired("base") + multiplicativeOrderCmd.MarkFlagRequired("modulus") +}