arb_sys/
dirichlet.rs

1#![allow(non_camel_case_types)]
2#![allow(non_snake_case)]
3
4//! *See the [Arb documentation](https://arblib.org/).
5
6use 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}