Skip to content

Add a function for multiplicative order#61

Merged
davidamarquis merged 2 commits intodevfrom
mult_order
Mar 25, 2026
Merged

Add a function for multiplicative order#61
davidamarquis merged 2 commits intodevfrom
mult_order

Conversation

@davidamarquis
Copy link
Copy Markdown
Collaborator

@davidamarquis davidamarquis commented Mar 25, 2026

@btime bench_mult_order_eric1(1009)
210.208 μs (8056 allocations: 188.81 KiB)

The function in this PR is the result for bench_mult_order:

@btime bench_mult_order(1009)
727.166 μs (28 allocations: 1.05 KiB

##########
[Unimportant] Here's the benchmark code:

function mult_order_eric1(n::Int, q::Int)
    (q <= 0 || n <= 0) && 
        throw(DomainError("q and n both need to be positive. Passed: q = $q, n = $n"))

    # finite stop instead of while
    for i in 0:n-1
        if mod(BigInt(q)^i, n) == 1
            return i
        end
    end
    error("Unable to compute ord($n, $q).")
end

function bench_mult_order_eric1(n::Int)
    for x in 2:(n-1) 
        mult_order_eric1(x,n) 
    end 
end

function bench_mult_order(n::Int)
    data = prepare_mult_order(n)
    for x in 2:(n-1)
        mult_order(x, data) 
    end 
end

@davidamarquis davidamarquis merged commit ed2eb16 into dev Mar 25, 2026
1 of 4 checks passed
@davidamarquis
Copy link
Copy Markdown
Collaborator Author

merged so I have a mult order function which I need to run

q = 2;
l = 9;
m = 35;
Fq = GF(q)
R_base, (x, y) = polynomial_ring(Fq, [:x, :y])
grid_x = x^l - 1
grid_y = y^m - 1
R, _ = quo(R_base, ideal(R_base, [grid_x, grid_y]));
deg = lcm(mult_order(q, l), mult_order(q, m))
K = GF(q, deg)
α = _nth_root(K, l)
β  = _nth_root(K, m)
R_K, (xk, yk) = polynomial_ring(K, [:x, :y])
S = orbit_cross(q, l, m, 7, 5);
e_S_ext = s_selected_idempotent(S, q, l, m, α, β, xk, yk)
e_S_dual = R(1 - map_coefficients(c -> Fq(coeff(c, 0)), e_S_ext, parent = R_base))
I_dual = ideal(R_base, [e_S_dual, grid_x, grid_y])
GB = groebner_basis(I_dual)
generators = typeof(e_S_dual)[]
for g in GB
    if g != grid_x && g != grid_y && !iszero(g)
        push!(generators, R(g))
    end
end
G = generator_matrix_2dcc(I_dual, l, m, Fq);
rank(G) == size(G, 1)
wts = [];
for i in 1:size(G, 1)
    push!(wts, wt(G[i, :]))
end
println("Minimum weight: ", minimum(wts))

Ω = q_Frobenius_orbits(q, l, m);
S_c = Ω[setdiff(1:length(Ω), [1, 4, 5])];
S_c_idem = s_selected_idempotent(S_c, q, l, m, α, β, xk, yk);
S_d = Ω[setdiff(1:length(Ω), [1, 5, 6])];
S_d_idem = s_selected_idempotent(S_d, q, l, m, α, β, xk, yk);
BCH_bound_2D(S_c, l, m, 1, l, m)
BCH_bound_2D(S_d, l, m, 1, l, m)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant