-
Notifications
You must be signed in to change notification settings - Fork 8
/
ecm-ecm.h
197 lines (166 loc) · 7.39 KB
/
ecm-ecm.h
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/* ecm-ecm.h - private header file for GMP-ECM.
Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
2012 Paul Zimmermann, Alexander Kruppa and Cyril Bouvier.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, see
http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
#ifndef _ECM_ECM_H
#define _ECM_ECM_H 1
#include "config.h"
#include <assert.h>
#define ASSERT_ALWAYS(expr) assert (expr)
#ifdef WANT_ASSERT
#define ASSERT(expr) assert (expr)
#else
#define ASSERT(expr) do {} while (0)
#endif
#include "ecm.h"
/* Structure for candidate usage. This is much more powerful than using a
simple mpz_t to hold the candidate. This structure also houses the
expression (in raw form), and will modify the expression as factors
are found (if in looping modes). Also, since we are warehousing all
of the data associated with the candidate, we also store whether the
candidate is PRP here (so testing will cease), along with the length
of the candidate. As each factor is found, the candidate will also
have the factor removed from it */
typedef struct
{
#if defined (CANDI_DEBUG)
unsigned long magic; /* used for debugging purposes while writing this code */
#endif
char *cpExpr; /* if non-NULL, then this is a "simpler" expression than the
decimal output of n */
mpz_t n; /* the cofactor candidate currently being used to find factors from */
unsigned ndigits; /* the number of digits (decimal) in n */
unsigned nexprlen; /* strlen of expression, 0 if there is NO expression */
int isPrp; /* usually 0, but turns 1 if factor found, and the cofactor is PRP,
OR if the original candidate was PRP and the user asked to prp check */
} mpcandi_t;
typedef struct
{
int Valid; /* Is ONLY set to 1 if there is a proper -go <integer> switch. Otherwise is 0
and if 0, then PM1, PP1 and ECM all ignore it */
char *cpOrigExpr; /* if non-NULL, then this is a "simpler" expression than the
decimal output of n */
mpcandi_t Candi; /* The value after expression checked */
int containsN; /* 0 for simple number or expression. 1 if the expression "contains" N as
that expression will have to be built for each candidate */
} mpgocandi_t;
/* auxi.c */
unsigned int nb_digits (const mpz_t);
int read_number (mpcandi_t*, FILE*, int);
int process_newfactor (mpz_t, int, mpcandi_t*, int, int, int, unsigned int*,
int*, mpz_t, FILE*, int, int);
/* Various logging levels */
/* OUTPUT_ALWAYS means print always, regardless of verbose value */
#define OUTPUT_ALWAYS 0
/* OUTPUT_NORMAL means print during normal program execution */
#define OUTPUT_NORMAL 1
/* OUTPUT_VERBOSE means print if the user requested more verbosity */
#define OUTPUT_VERBOSE 2
/* OUTPUT_RESVERBOSE is for printing residues (after stage 1 etc) */
#define OUTPUT_RESVERBOSE 3
/* OUTPUT_DEVVERBOSE is for printing internal parameters (for developers) */
#define OUTPUT_DEVVERBOSE 4
/* OUTPUT_TRACE is for printing trace data, produces lots of output */
#define OUTPUT_TRACE 5
/* OUTPUT_ERROR is for printing error messages */
#define OUTPUT_ERROR -1
#define MAX_NUMBER_PRINT_LEN 1000
#define NTT_SIZE_THRESHOLD 30
/* auxlib.c */
int test_verbose (int);
void set_verbose (int);
/* Return codes */
/* Bit coded values: 1: error (for example out of memory)
2: proper factor found, 4: factor is prime,
8: cofactor is prime or 1 */
#define ECM_EXIT_ERROR 1
#define ECM_COMP_FAC_COMP_COFAC 2
#define ECM_PRIME_FAC_COMP_COFAC (2+4)
#define ECM_INPUT_NUMBER_FOUND 8
#define ECM_COMP_FAC_PRIME_COFAC (2+8)
#define ECM_PRIME_FAC_PRIME_COFAC (2+4+8)
/* getprime.c */
double getprime ();
void getprime_clear ();
#define WANT_FREE_PRIME_TABLE(p) (p < 0.0)
#define FREE_PRIME_TABLE -1.0
/* b1_ainc.c */
double calc_B1_AutoIncrement(double cur_B1, double incB1val);
/* resume.c */
int read_resumefile_line (int *, mpz_t, mpz_t, mpcandi_t *,
mpz_t, mpz_t,
mpz_t, mpz_t, int *, int *,
double *, char *, char *, char *, char *, FILE *);
int write_resumefile (char *, int, mpz_t, ecm_params params,
mpcandi_t *, mpz_t, mpz_t,
const char *);
int write_s_in_file (char *, mpz_t);
int read_s_from_file (mpz_t, char *, double);
/* main.c */
int kbnc_z (double *k, unsigned long *b, unsigned long *n, signed long *c,
mpz_t z);
int kbnc_str (double *k, unsigned long *b, unsigned long *n, signed long *c,
char *z, mpz_t num);
/* eval.c */
int eval (mpcandi_t *n, FILE *fd, int bPrp);
int eval_str (mpcandi_t *n, char *cp, int primetest, char **EndChar); /* EndChar can be NULL */
void init_expr (void);
void free_expr (void);
/* candi.c */
void mpcandi_t_init (mpcandi_t *n); /* damn, a C++ class sure would have been nice :( */
void mpcandi_t_free (mpcandi_t *n);
int mpcandi_t_copy (mpcandi_t *to, mpcandi_t *from);
int mpcandi_t_add_candidate (mpcandi_t *n, mpz_t c, const char *cpExpr, int bPrp);
int mpcandi_t_addfoundfactor (mpcandi_t *n, mpz_t f, int displaywarning);
int mpcandi_t_addfoundfactor_d (mpcandi_t *n, double f);
/* candi.c Group Order candidate functions. */
void mpgocandi_t_init(mpgocandi_t *go);
void mpgocandi_t_free(mpgocandi_t *go);
int mpgocandi_fixup_with_N(mpgocandi_t *go, mpcandi_t *n);
/* random.c */
#undef get_random_ul
unsigned long get_random_ul (void);
#undef pp1_random_seed
void pp1_random_seed (mpz_t, mpz_t, gmp_randstate_t);
#undef pm1_random_seed
void pm1_random_seed (mpz_t, mpz_t, gmp_randstate_t);
/* memusage.c */
long PeakMemusage (void);
/* default number of probable prime tests */
#define PROBAB_PRIME_TESTS 1
/* maximal stage 1 bound = 2^53 - 1, the next prime being 2^53 + 5 */
#define MAX_B1 9007199254740991.0
/* The checksum for savefile is the product of all mandatory fields, modulo
the greatest prime below 2^32 */
#define CHKSUMMOD 4294967291U
#define ABS(x) ((x) >= 0 ? (x) : -(x))
#ifdef HAVE_APRCL
#include "aprtcle/mpz_aprcl.h"
#define ECM_FAC_PRIME APRTCLE_PRIME
#define ECM_FAC_PRP APRTCLE_PRP
#else
#define mpz_aprtcle(x,y) mpz_probab_prime_p(x,PROBAB_PRIME_TESTS)
#define ECM_FAC_PRIME 2 /* mpz_probab_prime_p and aprcl returns 2 when
a number is definitely prime */
#define ECM_FAC_PRP 1 /* mpz_probab_prime_p and aprcl returns 1 when
a number is a probable prime */
#endif
/* Cutoff value: Show APRCL progress only if n has more digits than cutoff */
#define APRCL_CUTOFF 400 /* for more than APRCL_CUTOFF digits, print
progress */
/* Cutoff value: Use APRCL if n has fewer digits than cutoff2
Use mpz_probab_prime_p if n has more digits than cutoff2 */
#define APRCL_CUTOFF2 500 /* for more than APRCL_CUTOFF2 digits, perform
a pseudo-primality test */
#endif /* _ECM_ECM_H */