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