1#![allow(non_camel_case_types)]
2#![allow(non_snake_case)]
3
4use crate::dlog::dlog_precomp_struct;
7use flint_sys::deps::*;
8use flint_sys::nmod_vec::nmod_t;
9use libc::c_int;
10
11#[repr(C)]
12#[derive(Debug, Copy, Clone)]
13pub struct dirichlet_prime_group_struct {
14 pub p: mp_limb_t,
15 pub e: c_int,
16 pub pe: nmod_t,
17 pub phi: nmod_t,
18 pub g: mp_limb_t,
19 pub dlog: *mut dlog_precomp_struct,
20}
21
22#[repr(C)]
23#[derive(Debug, Copy, Clone)]
24pub struct dirichlet_group_struct {
25 pub q: mp_limb_t,
26 pub q_even: mp_limb_t,
27 pub mod_: nmod_t,
28 pub rad_q: mp_limb_t,
29 pub phi_q: mp_limb_t,
30 pub neven: mp_limb_signed_t,
31 pub num: mp_limb_signed_t,
32 pub expo: mp_limb_t,
33 pub P: *mut dirichlet_prime_group_struct,
34 pub generators: *mut mp_limb_t,
35 pub PHI: *mut mp_limb_t,
36}
37
38pub type dirichlet_group_t = [dirichlet_group_struct; 1usize];
39
40#[repr(C)]
41#[derive(Debug, Copy, Clone)]
42pub struct dirichlet_char_struct {
43 pub n: mp_limb_t,
44 pub log: *mut mp_limb_t,
45}
46
47pub type dirichlet_char_t = [dirichlet_char_struct; 1usize];
48
49extern "C" {
50 pub fn dirichlet_group_num_primitive(G: *mut dirichlet_group_struct) -> mp_limb_t;
51 pub fn dirichlet_group_init(G: *mut dirichlet_group_struct, q: mp_limb_t);
52 pub fn dirichlet_subgroup_init(
53 H: *mut dirichlet_group_struct,
54 G: *mut dirichlet_group_struct,
55 h: mp_limb_t,
56 );
57 pub fn dirichlet_group_clear(G: *mut dirichlet_group_struct);
58 pub fn dirichlet_group_dlog_precompute(G: *mut dirichlet_group_struct, num: mp_limb_t);
59 pub fn dirichlet_group_dlog_clear(G: *mut dirichlet_group_struct);
60 pub fn dirichlet_conductor_ui(G: *mut dirichlet_group_struct, a: mp_limb_t) -> mp_limb_t;
61 pub fn dirichlet_parity_ui(G: *mut dirichlet_group_struct, a: mp_limb_t) -> c_int;
62 pub fn dirichlet_order_ui(G: *mut dirichlet_group_struct, a: mp_limb_t) -> mp_limb_t;
63 pub fn dirichlet_char_init(x: *mut dirichlet_char_struct, G: *mut dirichlet_group_struct);
64 pub fn dirichlet_char_clear(x: *mut dirichlet_char_struct);
65 pub fn dirichlet_char_print(G: *mut dirichlet_group_struct, x: *mut dirichlet_char_struct);
66 pub fn dirichlet_char_eq_deep(
67 G: *mut dirichlet_group_struct,
68 x: *mut dirichlet_char_struct,
69 y: *mut dirichlet_char_struct,
70 ) -> c_int;
71 pub fn dirichlet_parity_char(
72 G: *mut dirichlet_group_struct,
73 x: *mut dirichlet_char_struct,
74 ) -> c_int;
75 pub fn dirichlet_conductor_char(
76 G: *mut dirichlet_group_struct,
77 x: *mut dirichlet_char_struct,
78 ) -> mp_limb_t;
79 pub fn dirichlet_order_char(
80 G: *mut dirichlet_group_struct,
81 x: *mut dirichlet_char_struct,
82 ) -> mp_limb_t;
83 pub fn dirichlet_char_log(
84 x: *mut dirichlet_char_struct,
85 G: *mut dirichlet_group_struct,
86 m: mp_limb_t,
87 );
88 pub fn _dirichlet_char_exp(
89 x: *mut dirichlet_char_struct,
90 G: *mut dirichlet_group_struct,
91 ) -> mp_limb_t;
92 pub fn dirichlet_char_index(
93 x: *mut dirichlet_char_struct,
94 G: *mut dirichlet_group_struct,
95 j: mp_limb_t,
96 );
97 pub fn dirichlet_index_char(
98 G: *mut dirichlet_group_struct,
99 x: *mut dirichlet_char_struct,
100 ) -> mp_limb_t;
101 pub fn dirichlet_char_one(x: *mut dirichlet_char_struct, G: *mut dirichlet_group_struct);
102 pub fn dirichlet_char_first_primitive(
103 x: *mut dirichlet_char_struct,
104 G: *mut dirichlet_group_struct,
105 );
106 pub fn dirichlet_char_next(
107 x: *mut dirichlet_char_struct,
108 G: *mut dirichlet_group_struct,
109 ) -> c_int;
110 pub fn dirichlet_char_next_primitive(
111 x: *mut dirichlet_char_struct,
112 G: *mut dirichlet_group_struct,
113 ) -> c_int;
114 pub fn dirichlet_char_mul(
115 c: *mut dirichlet_char_struct,
116 G: *mut dirichlet_group_struct,
117 a: *mut dirichlet_char_struct,
118 b: *mut dirichlet_char_struct,
119 );
120 pub fn dirichlet_char_pow(
121 c: *mut dirichlet_char_struct,
122 G: *mut dirichlet_group_struct,
123 a: *mut dirichlet_char_struct,
124 n: mp_limb_t,
125 );
126 pub fn dirichlet_char_lower(
127 y: *mut dirichlet_char_struct,
128 H: *mut dirichlet_group_struct,
129 x: *mut dirichlet_char_struct,
130 G: *mut dirichlet_group_struct,
131 );
132 pub fn dirichlet_char_lift(
133 y: *mut dirichlet_char_struct,
134 G: *mut dirichlet_group_struct,
135 x: *mut dirichlet_char_struct,
136 H: *mut dirichlet_group_struct,
137 );
138 pub fn dirichlet_pairing(
139 G: *mut dirichlet_group_struct,
140 m: mp_limb_t,
141 n: mp_limb_t,
142 ) -> mp_limb_t;
143 pub fn dirichlet_pairing_char(
144 G: *mut dirichlet_group_struct,
145 a: *mut dirichlet_char_struct,
146 b: *mut dirichlet_char_struct,
147 ) -> mp_limb_t;
148 pub fn dirichlet_chi(
149 G: *mut dirichlet_group_struct,
150 chi: *mut dirichlet_char_struct,
151 n: mp_limb_t,
152 ) -> mp_limb_t;
153 pub fn dirichlet_vec_set_null(
154 v: *mut mp_limb_t,
155 G: *mut dirichlet_group_struct,
156 nv: mp_limb_signed_t,
157 );
158 pub fn dirichlet_chi_vec_loop(
159 v: *mut mp_limb_t,
160 G: *mut dirichlet_group_struct,
161 chi: *mut dirichlet_char_struct,
162 nv: mp_limb_signed_t,
163 );
164 pub fn dirichlet_chi_vec_primeloop(
165 v: *mut mp_limb_t,
166 G: *mut dirichlet_group_struct,
167 chi: *mut dirichlet_char_struct,
168 nv: mp_limb_signed_t,
169 );
170 pub fn dirichlet_chi_vec(
171 v: *mut mp_limb_t,
172 G: *mut dirichlet_group_struct,
173 chi: *mut dirichlet_char_struct,
174 nv: mp_limb_signed_t,
175 );
176 pub fn dirichlet_chi_vec_loop_order(
177 v: *mut mp_limb_t,
178 G: *mut dirichlet_group_struct,
179 chi: *mut dirichlet_char_struct,
180 order: mp_limb_t,
181 nv: mp_limb_signed_t,
182 );
183 pub fn dirichlet_chi_vec_primeloop_order(
184 v: *mut mp_limb_t,
185 G: *mut dirichlet_group_struct,
186 chi: *mut dirichlet_char_struct,
187 order: mp_limb_t,
188 nv: mp_limb_signed_t,
189 );
190 pub fn dirichlet_chi_vec_order(
191 v: *mut mp_limb_t,
192 G: *mut dirichlet_group_struct,
193 chi: *mut dirichlet_char_struct,
194 order: mp_limb_t,
195 nv: mp_limb_signed_t,
196 );
197}