1#![allow(non_camel_case_types)]
2
3use crate::deps::*;
6use crate::flint::*;
7use libc::c_int;
8
9#[repr(C)]
10#[derive(Debug, Copy, Clone, Hash)]
11pub struct nmod_t {
12 pub n: mp_limb_t,
13 pub ninv: mp_limb_t,
14 pub norm: mp_limb_t,
15}
16
17#[repr(C)]
18#[derive(Debug, Copy, Clone)]
19pub struct nmod_discrete_log_pohlig_hellman_table_entry_struct {
20 pub gammapow: mp_limb_t,
21 pub cm: mp_limb_t,
22}
23
24#[repr(C)]
25#[derive(Debug, Copy, Clone)]
26pub struct nmod_discrete_log_pohlig_hellman_entry_struct {
27 pub exp: mp_limb_signed_t,
28 pub prime: mp_limb_t,
29 pub gamma: mp_limb_t,
30 pub gammainv: mp_limb_t,
31 pub startingbeta: mp_limb_t,
32 pub co: mp_limb_t,
33 pub startinge: mp_limb_t,
34 pub idem: mp_limb_t,
35 pub cbound: mp_limb_t,
36 pub dbound: mp_limb_t,
37 pub table: *mut nmod_discrete_log_pohlig_hellman_table_entry_struct,
38}
39
40#[repr(C)]
41#[derive(Debug, Copy, Clone)]
42pub struct nmod_discrete_log_pohlig_hellman_struct {
43 pub mod_: nmod_t,
44 pub alpha: mp_limb_t,
45 pub alphainv: mp_limb_t,
46 pub num_factors: mp_limb_signed_t,
47 pub entries: *mut nmod_discrete_log_pohlig_hellman_entry_struct,
48}
49
50pub type nmod_discrete_log_pohlig_hellman_t = [nmod_discrete_log_pohlig_hellman_struct; 1usize];
51
52extern "C" {
53 pub fn _nmod_add(a: mp_limb_t, b: mp_limb_t, mod_: nmod_t) -> mp_limb_t;
54 pub fn _nmod_sub(a: mp_limb_t, b: mp_limb_t, mod_: nmod_t) -> mp_limb_t;
55 pub fn nmod_add(a: mp_limb_t, b: mp_limb_t, mod_: nmod_t) -> mp_limb_t;
56 pub fn nmod_sub(a: mp_limb_t, b: mp_limb_t, mod_: nmod_t) -> mp_limb_t;
57 pub fn nmod_neg(a: mp_limb_t, mod_: nmod_t) -> mp_limb_t;
58 pub fn nmod_mul(a: mp_limb_t, b: mp_limb_t, mod_: nmod_t) -> mp_limb_t;
59 pub fn nmod_addmul(a: mp_limb_t, b: mp_limb_t, c: mp_limb_t, mod_: nmod_t) -> mp_limb_t;
60 pub fn nmod_inv(a: mp_limb_t, mod_: nmod_t) -> mp_limb_t;
61 pub fn nmod_div(a: mp_limb_t, b: mp_limb_t, mod_: nmod_t) -> mp_limb_t;
62 pub fn nmod_pow_ui(a: mp_limb_t, exp: mp_limb_t, mod_: nmod_t) -> mp_limb_t;
63 pub fn nmod_init(mod_: *mut nmod_t, n: mp_limb_t);
64 pub fn _nmod_vec_init(len: mp_limb_signed_t) -> mp_ptr;
65 pub fn _nmod_vec_clear(vec: mp_ptr);
66 pub fn _nmod_vec_randtest(
67 vec: mp_ptr,
68 state: *mut flint_rand_s,
69 len: mp_limb_signed_t,
70 mod_: nmod_t,
71 );
72 pub fn _nmod_vec_zero(vec: mp_ptr, len: mp_limb_signed_t);
73 pub fn _nmod_vec_max_bits(vec: mp_srcptr, len: mp_limb_signed_t) -> mp_limb_t;
74 pub fn _nmod_vec_set(res: mp_ptr, vec: mp_srcptr, len: mp_limb_signed_t);
75 pub fn _nmod_vec_swap(a: mp_ptr, b: mp_ptr, length: mp_limb_signed_t);
76 pub fn _nmod_vec_equal(vec: mp_srcptr, vec2: mp_srcptr, len: mp_limb_signed_t) -> c_int;
77 pub fn _nmod_vec_is_zero(vec: mp_srcptr, len: mp_limb_signed_t) -> c_int;
78 pub fn _nmod_vec_reduce(res: mp_ptr, vec: mp_srcptr, len: mp_limb_signed_t, mod_: nmod_t);
79 pub fn _nmod_vec_add(
80 res: mp_ptr,
81 vec1: mp_srcptr,
82 vec2: mp_srcptr,
83 len: mp_limb_signed_t,
84 mod_: nmod_t,
85 );
86 pub fn _nmod_vec_sub(
87 res: mp_ptr,
88 vec1: mp_srcptr,
89 vec2: mp_srcptr,
90 len: mp_limb_signed_t,
91 mod_: nmod_t,
92 );
93 pub fn _nmod_vec_neg(res: mp_ptr, vec: mp_srcptr, len: mp_limb_signed_t, mod_: nmod_t);
94 pub fn _nmod_vec_scalar_mul_nmod(
95 res: mp_ptr,
96 vec: mp_srcptr,
97 len: mp_limb_signed_t,
98 c: mp_limb_t,
99 mod_: nmod_t,
100 );
101 pub fn _nmod_vec_scalar_mul_nmod_shoup(
102 res: mp_ptr,
103 vec: mp_srcptr,
104 len: mp_limb_signed_t,
105 c: mp_limb_t,
106 mod_: nmod_t,
107 );
108 pub fn _nmod_vec_scalar_addmul_nmod(
109 res: mp_ptr,
110 vec: mp_srcptr,
111 len: mp_limb_signed_t,
112 c: mp_limb_t,
113 mod_: nmod_t,
114 );
115 pub fn _nmod_vec_dot_bound_limbs(len: mp_limb_signed_t, mod_: nmod_t) -> c_int;
116 pub fn _nmod_vec_dot(
117 vec1: mp_srcptr,
118 vec2: mp_srcptr,
119 len: mp_limb_signed_t,
120 mod_: nmod_t,
121 nlimbs: c_int,
122 ) -> mp_limb_t;
123 pub fn _nmod_vec_dot_ptr(
124 vec1: mp_srcptr,
125 vec2: *const mp_ptr,
126 offset: mp_limb_signed_t,
127 len: mp_limb_signed_t,
128 mod_: nmod_t,
129 nlimbs: c_int,
130 ) -> mp_limb_t;
131 pub fn nmod_discrete_log_pohlig_hellman_init(L: *mut nmod_discrete_log_pohlig_hellman_struct);
132 pub fn nmod_discrete_log_pohlig_hellman_clear(L: *mut nmod_discrete_log_pohlig_hellman_struct);
133 pub fn nmod_discrete_log_pohlig_hellman_precompute_prime(
134 L: *mut nmod_discrete_log_pohlig_hellman_struct,
135 p: mp_limb_t,
136 ) -> f64;
137 pub fn nmod_discrete_log_pohlig_hellman_run(
138 L: *mut nmod_discrete_log_pohlig_hellman_struct,
139 y: mp_limb_t,
140 ) -> mp_limb_t;
141 pub fn nmod_discrete_log_pohlig_hellman_primitive_root(
142 L: *mut nmod_discrete_log_pohlig_hellman_struct,
143 ) -> mp_limb_t;
144}