From 7d554fb945c3f3f827bfefa02f6093acee3ae61d Mon Sep 17 00:00:00 2001 From: filifa Date: Tue, 19 Aug 2025 22:35:15 -0400 Subject: [PATCH] optimize a bunch --- cmd/primitiveRoot.go | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/cmd/primitiveRoot.go b/cmd/primitiveRoot.go index 99b8eb0..04f969b 100644 --- a/cmd/primitiveRoot.go +++ b/cmd/primitiveRoot.go @@ -28,40 +28,39 @@ import ( var modulus string var tpf []string +func totient(n *big.Int) *big.Int { + total := big.NewInt(0) + for a := big.NewInt(1); a.Cmp(n) == -1; a.Add(a, big.NewInt(1)) { + gcd := new(big.Int).GCD(nil, nil, a, n) + if gcd.Cmp(big.NewInt(1)) == 0 { + total.Add(total, big.NewInt(1)) + } + } + + return total +} + func computeNaive(modulus *big.Int) (*big.Int, error) { if modulus.Cmp(big.NewInt(1)) == 0 { return big.NewInt(0), nil } - coprimes := make(map[string]bool) - for a := big.NewInt(1); a.Cmp(modulus) == -1; a.Add(a, big.NewInt(1)) { - gcd := new(big.Int).GCD(nil, nil, a, modulus) - if gcd.Cmp(big.NewInt(1)) != 0 { + phi := totient(modulus) + + for g := big.NewInt(1); g.Cmp(modulus) == -1; g.Add(g, big.NewInt(1)) { + tmp := new(big.Int).GCD(nil, nil, g, modulus) + if tmp.Cmp(big.NewInt(1)) != 0 { continue } - coprimes[a.Text(10)] = true - } - - for g := big.NewInt(1); g.Cmp(modulus) == -1; g.Add(g, big.NewInt(1)) { - e := big.NewInt(1) - exps := make(map[string]big.Int) - for k := big.NewInt(1); k.Cmp(modulus) == -1; k.Add(k, big.NewInt(1)) { + e := new(big.Int).Set(g) + var k *big.Int + for k = big.NewInt(1); e.Cmp(big.NewInt(1)) != 0; k.Add(k, big.NewInt(1)) { e.Mul(e, g) e.Mod(e, modulus) - exps[e.Text(10)] = *k } - isPrimitive := true - for a := range coprimes { - _, ok := exps[a] - if !ok { - isPrimitive = false - break - } - } - - if isPrimitive { + if k.Cmp(phi) == 0 { return g, nil } }