Orbiter 2022
Combinatorial Objects
number_theory.h
Go to the documentation of this file.
1/*
2 * number_theory.h
3 *
4 * Created on: Nov 2, 2021
5 * Author: betten
6 */
7
8#ifndef SRC_LIB_FOUNDATIONS_NUMBER_THEORY_NUMBER_THEORY_H_
9#define SRC_LIB_FOUNDATIONS_NUMBER_THEORY_NUMBER_THEORY_H_
10
11
12
13namespace orbiter {
14namespace layer1_foundations {
15namespace number_theory {
16
17
18
19// #############################################################################
20// cyclotomic_sets.cpp
21// #############################################################################
22
23
25
26
27
29public:
30 int n;
31 int q;
32 int m;
33 int qm;
34
35 int *Index;
37
40 void init(field_theory::finite_field *F, int n, int verbose_level);
41 void print();
42 void print_latex(std::ostream &ost);
43 void print_latex_with_selection(std::ostream &ost, int *Selection, int nb_sel);
44
45};
46
47
48// #############################################################################
49// elliptic_curve.cpp
50// #############################################################################
51
52
53
55
56
57
59
60public:
61 int q;
62 int p;
63 int e;
64 int b, c; // the equation of the curve is Y^2 = X^3 + bX + c mod p
65 int nb; // number of points
66 int *T; // [nb * 3] point coordinates
67 // the point at infinity is last
68 int *A; // [nb * nb] addition table
70
71
74 void null();
75 void freeself();
76 void init(field_theory::finite_field *F, int b, int c, int verbose_level);
77 void compute_points(int verbose_level);
78 void add_point_to_table(int x, int y, int z);
79 int evaluate_RHS(int x);
80 // evaluates x^3 + bx + c
81 void print_points();
83 void addition(
84 int x1, int y1, int z1,
85 int x2, int y2, int z2,
86 int &x3, int &y3, int &z3, int verbose_level);
87 void save_incidence_matrix(std::string &fname, int verbose_level);
88 void draw_grid(
89 std::string &fname,
91 int f_with_grid, int f_with_points, int point_density,
92 int f_path, int start_idx, int nb_steps,
93 int verbose_level);
95 int f_with_grid, int f_with_points, int point_density,
96 int f_path, int start_idx, int nb_steps,
97 int verbose_level);
98 void make_affine_point(int x1, int x2, int x3,
99 int &a, int &b, int verbose_level);
100 void compute_addition_table(int verbose_level);
102 int index_of_point(int x1, int x2, int x3);
103 void latex_points_with_order(std::ostream &ost);
104 void latex_order_of_all_points(std::ostream &ost);
105 void order_of_all_points(std::vector<int> &Ord);
106 int order_of_point(int i);
107 void print_all_powers(int i);
108};
109
110
111
112// #############################################################################
113// number_theoretic_transform.cpp:
114// #############################################################################
115
117
119public:
120
121 int k;
122 int q;
123
124 std::string fname_code;
125
126 field_theory::finite_field *F; // no ownership, do not destroy
127
128 int *N;
129
132 int **A; // Fourier matrices for the positively wrapped convolution
133 int **Av;
134 int **A_log;
135 int *Omega;
136
137
138 int **G;
139 int **D;
140 int **Dv;
141 int **T;
142 int **Tv;
143 int **P;
144
145 int *X, *Y, *Z;
146 int *X1, *X2;
147 int *Y1, *Y2;
148
149 int **Gr;
150 int **Dr;
151 int **Dvr;
152 int **Tr;
153 int **Tvr;
154 int **Pr;
155
156 int *Tmp1;
157 int *Tmp2;
158
160
161 int Q;
164 int psi;
165 int *Psi_powers; // powers of psi
166
167
171 int k, int q, int verbose_level);
172 void write_code(std::string &fname_code,
173 int verbose_level);
174 void write_code2(std::ostream &ost,
175 int f_forward,
176 int &nb_add, int &nb_negate, int &nb_mult,
177 int verbose_level);
178 void write_code_header(std::ostream &ost,
179 std::string &fname_code, int verbose_level);
180 void make_level(int s, int verbose_level);
181 void paste(int **Xr, int **X, int s, int verbose_level);
182 void make_G_matrix(int s, int verbose_level);
183 void make_D_matrix(int s, int verbose_level);
184 void make_T_matrix(int s, int verbose_level);
185 void make_P_matrix(int s, int verbose_level);
187 int nb, int sz, int *Result, int verbose_level);
188};
189
190// #############################################################################
191// number_theory_domain.cpp:
192// #############################################################################
193
195
196
198
199public:
202 long int mod(long int a, long int p);
203 long int int_negate(long int a, long int p);
204 long int power_mod(long int a, long int n, long int p);
205 long int inverse_mod(long int a, long int p);
206 long int mult_mod(long int a, long int b, long int p);
207 long int add_mod(long int a, long int b, long int p);
208 long int ab_over_c(long int a, long int b, long int c);
209 long int int_abs(long int a);
210 long int gcd_lint(long int m, long int n);
211 void extended_gcd_int(int m, int n, int &g, int &u, int &v);
212 void extended_gcd_lint(long int m, long int n,
213 long int &g, long int &u, long int &v);
214 long int gcd_with_key_in_latex(std::ostream &ost,
215 long int a, long int b, int f_key, int verbose_level);
216 int i_power_j_safe(int i, int j);
217 long int i_power_j_lint_safe(int i, int j, int verbose_level);
218 long int i_power_j_lint(long int i, long int j);
219 int i_power_j(int i, int j);
220 void do_eulerfunction_interval(long int n_min, long int n_max, int verbose_level);
221 long int euler_function(long int n);
222 long int moebius_function(long int n);
223 long int order_mod_p(long int a, long int p);
224 int int_log2(int n);
225 int int_log10(int n);
226 int lint_log10(long int n);
227 int int_logq(int n, int q);
228 // returns the number of digits in base q representation
229 int lint_logq(long int n, int q);
230 int is_strict_prime_power(int q);
231 // assuming that q is a prime power, this fuction tests
232 // whether or not q is a strict prime power
233 int is_prime(int p);
234 int is_prime_power(int q);
235 int is_prime_power(int q, int &p, int &h);
236 int smallest_primedivisor(int n);
237 //Computes the smallest prime dividing $n$.
238 //The algorithm is based on Lueneburg~\cite{Lueneburg87a}.
239 int sp_ge(int n, int p_min);
240 int factor_int(int a, int *&primes, int *&exponents);
241 void factor_lint(long int a, std::vector<long int> &primes, std::vector<int> &exponents);
242 void factor_prime_power(int q, int &p, int &e);
243 long int primitive_root_randomized(long int p, int verbose_level);
244 long int primitive_root(long int p, int verbose_level);
245 int Legendre(long int a, long int p, int verbose_level);
246 int Jacobi(long int a, long int m, int verbose_level);
247 int Jacobi_with_key_in_latex(std::ostream &ost,
248 long int a, long int m, int verbose_level);
249 int Legendre_with_key_in_latex(std::ostream &ost,
250 long int a, long int m, int verbose_level);
251 //Computes the Legendre symbol $\left( \frac{a}{m} \right)$.
252 int ny2(long int x, long int &x1);
253 int ny_p(long int n, long int p);
254 //long int sqrt_mod_simple(long int a, long int p);
255 void print_factorization(int nb_primes, int *primes, int *exponents);
257 ring_theory::longinteger_object *primes, int *exponents);
258 void int_add_fractions(int at, int ab, int bt, int bb,
259 int &ct, int &cb, int verbose_level);
260 void int_mult_fractions(int at, int ab, int bt, int bb,
261 int &ct, int &cb, int verbose_level);
262 int choose_a_prime_greater_than(int lower_bound);
263 int choose_a_prime_in_interval(int lower_bound, int upper_bound);
264 int random_integer_greater_than(int n, int lower_bound);
265 int random_integer_in_interval(int lower_bound, int upper_bound);
267 int get_prime_from_table(int idx);
268 long int ChineseRemainder2(long int a1, long int a2,
269 long int p1, long int p2, int verbose_level);
270 void do_babystep_giantstep(long int p, long int g, long int h,
271 int f_latex, std::ostream &ost, int verbose_level);
272 void sieve(std::vector<int> &primes,
273 int factorbase, int verbose_level);
274 void sieve_primes(std::vector<int> &v,
275 int from, int to, int limit, int verbose_level);
276 int nb_primes(int n);
277 void cyclotomic_set(std::vector<int> &cyclotomic_set,
278 int a, int q, int n, int verbose_level);
280 int b, int c,
281 int x1, int x2, int x3,
282 int y1, int y2, int y3,
283 int &z1, int &z2, int &z3, int verbose_level);
285 int b, int c, int n,
286 int x1, int y1, int z1,
287 int &x3, int &y3, int &z3,
288 int verbose_level);
290 int b, int c, int n,
291 int x1, int y1, int z1,
292 int &x3, int &y3, int &z3,
293 int verbose_level);
295 int x, int b, int c);
297 int b, int c, int &nb, int *&T, int verbose_level);
299 int b, int c, int &order,
300 int x1, int y1, int z1,
301 std::vector<std::vector<int> > &Pts,
302 int verbose_level);
304 int b, int c,
305 int x1, int y1, int z1,
306 int x3, int y3, int z3,
307 int verbose_level);
308 int eulers_totient_function(int n, int verbose_level);
309
310};
311
312
313
314
315}}}
316
317
318
319#endif /* SRC_LIB_FOUNDATIONS_NUMBER_THEORY_NUMBER_THEORY_H_ */
options for drawing an object of type layered_graph
Definition: graphics.h:457
a general 2D graphical output interface (metapost, tikz, postscript)
Definition: graphics.h:545
void print_latex_with_selection(std::ostream &ost, int *Selection, int nb_sel)
void init(field_theory::finite_field *F, int n, int verbose_level)
a fixed elliptic curve in Weierstrass form
Definition: number_theory.h:58
void init(field_theory::finite_field *F, int b, int c, int verbose_level)
void save_incidence_matrix(std::string &fname, int verbose_level)
void draw_grid(std::string &fname, graphics::layered_graph_draw_options *Draw_options, int f_with_grid, int f_with_points, int point_density, int f_path, int start_idx, int nb_steps, int verbose_level)
void make_affine_point(int x1, int x2, int x3, int &a, int &b, int verbose_level)
void addition(int x1, int y1, int z1, int x2, int y2, int z2, int &x3, int &y3, int &z3, int verbose_level)
void draw_grid2(graphics::mp_graphics &G, int f_with_grid, int f_with_points, int point_density, int f_path, int start_idx, int nb_steps, int verbose_level)
void write_code_header(std::ostream &ost, std::string &fname_code, int verbose_level)
void init(field_theory::finite_field *F, int k, int q, int verbose_level)
void multiply_matrix_stack(field_theory::finite_field *F, int **S, int nb, int sz, int *Result, int verbose_level)
void write_code2(std::ostream &ost, int f_forward, int &nb_add, int &nb_negate, int &nb_mult, int verbose_level)
void factor_lint(long int a, std::vector< long int > &primes, std::vector< int > &exponents)
int Legendre_with_key_in_latex(std::ostream &ost, long int a, long int m, int verbose_level)
void sieve(std::vector< int > &primes, int factorbase, int verbose_level)
void print_longfactorization(int nb_primes, ring_theory::longinteger_object *primes, int *exponents)
long int ChineseRemainder2(long int a1, long int a2, long int p1, long int p2, int verbose_level)
void do_eulerfunction_interval(long int n_min, long int n_max, int verbose_level)
void elliptic_curve_addition(field_theory::finite_field *F, int b, int c, int x1, int x2, int x3, int y1, int y2, int y3, int &z1, int &z2, int &z3, int verbose_level)
void elliptic_curve_all_point_multiples(field_theory::finite_field *F, int b, int c, int &order, int x1, int y1, int z1, std::vector< std::vector< int > > &Pts, int verbose_level)
void sieve_primes(std::vector< int > &v, int from, int to, int limit, int verbose_level)
long int gcd_with_key_in_latex(std::ostream &ost, long int a, long int b, int f_key, int verbose_level)
void elliptic_curve_point_multiple_with_log(field_theory::finite_field *F, int b, int c, int n, int x1, int y1, int z1, int &x3, int &y3, int &z3, int verbose_level)
void print_factorization(int nb_primes, int *primes, int *exponents)
void cyclotomic_set(std::vector< int > &cyclotomic_set, int a, int q, int n, int verbose_level)
void extended_gcd_lint(long int m, long int n, long int &g, long int &u, long int &v)
void do_babystep_giantstep(long int p, long int g, long int h, int f_latex, std::ostream &ost, int verbose_level)
int elliptic_curve_discrete_log(field_theory::finite_field *F, int b, int c, int x1, int y1, int z1, int x3, int y3, int z3, int verbose_level)
void elliptic_curve_point_multiple(field_theory::finite_field *F, int b, int c, int n, int x1, int y1, int z1, int &x3, int &y3, int &z3, int verbose_level)
void int_mult_fractions(int at, int ab, int bt, int bb, int &ct, int &cb, int verbose_level)
int Jacobi_with_key_in_latex(std::ostream &ost, long int a, long int m, int verbose_level)
void elliptic_curve_points(field_theory::finite_field *F, int b, int c, int &nb, int *&T, int verbose_level)
int elliptic_curve_evaluate_RHS(field_theory::finite_field *F, int x, int b, int c)
void int_add_fractions(int at, int ab, int bt, int bb, int &ct, int &cb, int verbose_level)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
the orbiter library for the classification of combinatorial objects