line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
#include |
2
|
|
|
|
|
|
|
#include |
3
|
|
|
|
|
|
|
#include |
4
|
|
|
|
|
|
|
#include |
5
|
|
|
|
|
|
|
#include |
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
/* Use long double to get a little more precision when we're calculating the |
8
|
|
|
|
|
|
|
* math functions -- especially those calculated with a series. Long double |
9
|
|
|
|
|
|
|
* is defined in C89 (ISO C). Note that 'long double' on many platforms is |
10
|
|
|
|
|
|
|
* identical to 'double so it may buy us nothing. But it's worth trying. |
11
|
|
|
|
|
|
|
* |
12
|
|
|
|
|
|
|
* While the type was in C89, math functions using it are in C99. Some |
13
|
|
|
|
|
|
|
* systems didn't really get it right (e.g. NetBSD which left out some |
14
|
|
|
|
|
|
|
* functions for 13 years). |
15
|
|
|
|
|
|
|
*/ |
16
|
|
|
|
|
|
|
#include |
17
|
|
|
|
|
|
|
#if _MSC_VER || defined(__IBMC__) | defined(__IBMCPP__) || (defined(__STDC_VERSION__) && __STDC_VERSION >= 199901L) |
18
|
|
|
|
|
|
|
/* math.h should give us these as functions or macros. |
19
|
|
|
|
|
|
|
* |
20
|
|
|
|
|
|
|
* extern long double fabsl(long double); |
21
|
|
|
|
|
|
|
* extern long double floorl(long double); |
22
|
|
|
|
|
|
|
* extern long double ceill(long double); |
23
|
|
|
|
|
|
|
* extern long double sqrtl(long double); |
24
|
|
|
|
|
|
|
* extern long double powl(long double, long double); |
25
|
|
|
|
|
|
|
* extern long double expl(long double); |
26
|
|
|
|
|
|
|
* extern long double logl(long double); |
27
|
|
|
|
|
|
|
*/ |
28
|
|
|
|
|
|
|
#else |
29
|
|
|
|
|
|
|
#define fabsl(x) (long double) fabs( (double) (x) ) |
30
|
|
|
|
|
|
|
#define floorl(x) (long double) floor( (double) (x) ) |
31
|
|
|
|
|
|
|
#define ceill(x) (long double) ceil( (double) (x) ) |
32
|
|
|
|
|
|
|
#define sqrtl(x) (long double) sqrt( (double) (x) ) |
33
|
|
|
|
|
|
|
#define powl(x, y) (long double) pow( (double) (x), (double) (y) ) |
34
|
|
|
|
|
|
|
#define expl(x) (long double) exp( (double) (x) ) |
35
|
|
|
|
|
|
|
#define logl(x) (long double) log( (double) (x) ) |
36
|
|
|
|
|
|
|
#endif |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
#ifdef LDBL_INFINITY |
39
|
|
|
|
|
|
|
#undef INFINITY |
40
|
|
|
|
|
|
|
#define INFINITY LDBL_INFINITY |
41
|
|
|
|
|
|
|
#elif !defined(INFINITY) |
42
|
|
|
|
|
|
|
#define INFINITY (DBL_MAX + DBL_MAX) |
43
|
|
|
|
|
|
|
#endif |
44
|
|
|
|
|
|
|
#ifndef LDBL_EPSILON |
45
|
|
|
|
|
|
|
#define LDBL_EPSILON 1e-16 |
46
|
|
|
|
|
|
|
#endif |
47
|
|
|
|
|
|
|
#ifndef LDBL_MAX |
48
|
|
|
|
|
|
|
#define LDBL_MAX DBL_MAX |
49
|
|
|
|
|
|
|
#endif |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
#include "ptypes.h" |
52
|
|
|
|
|
|
|
#define FUNC_isqrt 1 |
53
|
|
|
|
|
|
|
#define FUNC_icbrt 1 |
54
|
|
|
|
|
|
|
#define FUNC_lcm_ui 1 |
55
|
|
|
|
|
|
|
#define FUNC_ctz 1 |
56
|
|
|
|
|
|
|
#define FUNC_log2floor 1 |
57
|
|
|
|
|
|
|
#define FUNC_is_perfect_square |
58
|
|
|
|
|
|
|
#define FUNC_is_perfect_cube |
59
|
|
|
|
|
|
|
#define FUNC_is_perfect_fifth |
60
|
|
|
|
|
|
|
#define FUNC_is_perfect_seventh |
61
|
|
|
|
|
|
|
#define FUNC_next_prime_in_sieve 1 |
62
|
|
|
|
|
|
|
#define FUNC_prev_prime_in_sieve 1 |
63
|
|
|
|
|
|
|
#define FUNC_ipow 1 |
64
|
|
|
|
|
|
|
#include "util.h" |
65
|
|
|
|
|
|
|
#include "sieve.h" |
66
|
|
|
|
|
|
|
#include "primality.h" |
67
|
|
|
|
|
|
|
#include "cache.h" |
68
|
|
|
|
|
|
|
#include "lmo.h" |
69
|
|
|
|
|
|
|
#include "factor.h" |
70
|
|
|
|
|
|
|
#include "mulmod.h" |
71
|
|
|
|
|
|
|
#include "constants.h" |
72
|
|
|
|
|
|
|
#include "montmath.h" |
73
|
|
|
|
|
|
|
#include "csprng.h" |
74
|
|
|
|
|
|
|
#include "keyval.h" |
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
#define KAHAN_INIT(s) \ |
77
|
|
|
|
|
|
|
LNV s ## _y, s ## _t; \ |
78
|
|
|
|
|
|
|
LNV s ## _c = 0.0; \ |
79
|
|
|
|
|
|
|
LNV s = 0.0; |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
#define KAHAN_SUM(s, term) \ |
82
|
|
|
|
|
|
|
do { \ |
83
|
|
|
|
|
|
|
s ## _y = (term) - s ## _c; \ |
84
|
|
|
|
|
|
|
s ## _t = s + s ## _y; \ |
85
|
|
|
|
|
|
|
s ## _c = (s ## _t - s) - s ## _y; \ |
86
|
|
|
|
|
|
|
s = s ## _t; \ |
87
|
|
|
|
|
|
|
} while (0) |
88
|
|
|
|
|
|
|
|
89
|
57866
|
|
|
|
|
|
int _numcmp(const void *a, const void *b) { |
90
|
57866
|
|
|
|
|
|
const UV *x = a, *y = b; |
91
|
57866
|
100
|
|
|
|
|
return (*x > *y) ? 1 : (*x < *y) ? -1 : 0; |
|
|
50
|
|
|
|
|
|
92
|
|
|
|
|
|
|
} |
93
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
static int _verbose = 0; |
95
|
8
|
|
|
|
|
|
void _XS_set_verbose(int v) { _verbose = v; } |
96
|
34524
|
|
|
|
|
|
int _XS_get_verbose(void) { return _verbose; } |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
static int _call_gmp = 0; |
99
|
73
|
|
|
|
|
|
void _XS_set_callgmp(int v) { _call_gmp = v; } |
100
|
19596
|
|
|
|
|
|
int _XS_get_callgmp(void) { return _call_gmp; } |
101
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
static int _secure = 0; |
103
|
0
|
|
|
|
|
|
void _XS_set_secure(void) { _secure = 1; } |
104
|
22
|
|
|
|
|
|
int _XS_get_secure(void) { return _secure; } |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
/* We'll use this little static sieve to quickly answer small values of |
107
|
|
|
|
|
|
|
* is_prime, next_prime, prev_prime, prime_count |
108
|
|
|
|
|
|
|
* for non-threaded Perl it's basically the same as getting the primary |
109
|
|
|
|
|
|
|
* cache. It guarantees we'll have an answer with no waiting on any version. |
110
|
|
|
|
|
|
|
*/ |
111
|
|
|
|
|
|
|
static const unsigned char prime_sieve30[] = |
112
|
|
|
|
|
|
|
{0x01,0x20,0x10,0x81,0x49,0x24,0xc2,0x06,0x2a,0xb0,0xe1,0x0c,0x15,0x59,0x12, |
113
|
|
|
|
|
|
|
0x61,0x19,0xf3,0x2c,0x2c,0xc4,0x22,0xa6,0x5a,0x95,0x98,0x6d,0x42,0x87,0xe1, |
114
|
|
|
|
|
|
|
0x59,0xa9,0xa9,0x1c,0x52,0xd2,0x21,0xd5,0xb3,0xaa,0x26,0x5c,0x0f,0x60,0xfc, |
115
|
|
|
|
|
|
|
0xab,0x5e,0x07,0xd1,0x02,0xbb,0x16,0x99,0x09,0xec,0xc5,0x47,0xb3,0xd4,0xc5, |
116
|
|
|
|
|
|
|
0xba,0xee,0x40,0xab,0x73,0x3e,0x85,0x4c,0x37,0x43,0x73,0xb0,0xde,0xa7,0x8e, |
117
|
|
|
|
|
|
|
0x8e,0x64,0x3e,0xe8,0x10,0xab,0x69,0xe5,0xf7,0x1a,0x7c,0x73,0xb9,0x8d,0x04, |
118
|
|
|
|
|
|
|
0x51,0x9a,0x6d,0x70,0xa7,0x78,0x2d,0x6d,0x27,0x7e,0x9a,0xd9,0x1c,0x5f,0xee, |
119
|
|
|
|
|
|
|
0xc7,0x38,0xd9,0xc3,0x7e,0x14,0x66,0x72,0xae,0x77,0xc1,0xdb,0x0c,0xcc,0xb2, |
120
|
|
|
|
|
|
|
0xa5,0x74,0xe3,0x58,0xd5,0x4b,0xa7,0xb3,0xb1,0xd9,0x09,0xe6,0x7d,0x23,0x7c, |
121
|
|
|
|
|
|
|
0x3c,0xd3,0x0e,0xc7,0xfd,0x4a,0x32,0x32,0xfd,0x4d,0xb5,0x6b,0xf3,0xa8,0xb3, |
122
|
|
|
|
|
|
|
0x85,0xcf,0xbc,0xf4,0x0e,0x34,0xbb,0x93,0xdb,0x07,0xe6,0xfe,0x6a,0x57,0xa3, |
123
|
|
|
|
|
|
|
0x8c,0x15,0x72,0xdb,0x69,0xd4,0xaf,0x59,0xdd,0xe1,0x3b,0x2e,0xb7,0xf9,0x2b, |
124
|
|
|
|
|
|
|
0xc5,0xd0,0x8b,0x63,0xf8,0x95,0xfa,0x77,0x40,0x97,0xea,0xd1,0x9f,0xaa,0x1c, |
125
|
|
|
|
|
|
|
0x48,0xae,0x67,0xf7,0xeb,0x79,0xa5,0x55,0xba,0xb2,0xb6,0x8f,0xd8,0x2d,0x6c, |
126
|
|
|
|
|
|
|
0x2a,0x35,0x54,0xfd,0x7c,0x9e,0xfa,0xdb,0x31,0x78,0xdd,0x3d,0x56,0x52,0xe7, |
127
|
|
|
|
|
|
|
0x73,0xb2,0x87,0x2e,0x76,0xe9,0x4f,0xa8,0x38,0x9d,0x5d,0x3f,0xcb,0xdb,0xad, |
128
|
|
|
|
|
|
|
0x51,0xa5,0xbf,0xcd,0x72,0xde,0xf7,0xbc,0xcb,0x49,0x2d,0x49,0x26,0xe6,0x1e, |
129
|
|
|
|
|
|
|
0x9f,0x98,0xe5,0xc6,0x9f,0x2f,0xbb,0x85,0x6b,0x65,0xf6,0x77,0x7c,0x57,0x8b, |
130
|
|
|
|
|
|
|
0xaa,0xef,0xd8,0x5e,0xa2,0x97,0xe1,0xdc,0x37,0xcd,0x1f,0xe6,0xfc,0xbb,0x8c, |
131
|
|
|
|
|
|
|
0xb7,0x4e,0xc7,0x3c,0x19,0xd5,0xa8,0x9e,0x67,0x4a,0xe3,0xf5,0x97,0x3a,0x7e, |
132
|
|
|
|
|
|
|
0x70,0x53,0xfd,0xd6,0xe5,0xb8,0x1c,0x6b,0xee,0xb1,0x9b,0xd1,0xeb,0x34,0xc2, |
133
|
|
|
|
|
|
|
0x23,0xeb,0x3a,0xf9,0xef,0x16,0xd6,0x4e,0x7d,0x16,0xcf,0xb8,0x1c,0xcb,0xe6, |
134
|
|
|
|
|
|
|
0x3c,0xda,0xf5,0xcf}; |
135
|
|
|
|
|
|
|
#define NPRIME_SIEVE30 (sizeof(prime_sieve30)/sizeof(prime_sieve30[0])) |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
static const unsigned short primes_tiny[] = |
138
|
|
|
|
|
|
|
{0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97, |
139
|
|
|
|
|
|
|
101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191, |
140
|
|
|
|
|
|
|
193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283, |
141
|
|
|
|
|
|
|
293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401, |
142
|
|
|
|
|
|
|
409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503}; |
143
|
|
|
|
|
|
|
#define NPRIMES_TINY (sizeof(primes_tiny)/sizeof(primes_tiny[0])) |
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
/* Return of 2 if n is prime, 0 if not. Do it fast. */ |
146
|
444016
|
|
|
|
|
|
int is_prime(UV n) |
147
|
|
|
|
|
|
|
{ |
148
|
444016
|
100
|
|
|
|
|
if (n <= 10) |
149
|
12983
|
100
|
|
|
|
|
return (n == 2 || n == 3 || n == 5 || n == 7) ? 2 : 0; |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
150
|
|
|
|
|
|
|
|
151
|
431033
|
100
|
|
|
|
|
if (n < UVCONST(200000000)) { |
152
|
429111
|
|
|
|
|
|
UV d = n/30; |
153
|
429111
|
|
|
|
|
|
UV m = n - d*30; |
154
|
429111
|
|
|
|
|
|
unsigned char mtab = masktab30[m]; /* Bitmask in mod30 wheel */ |
155
|
|
|
|
|
|
|
const unsigned char* sieve; |
156
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
/* Return 0 if a multiple of 2, 3, or 5 */ |
158
|
429111
|
100
|
|
|
|
|
if (mtab == 0) |
159
|
417231
|
|
|
|
|
|
return 0; |
160
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
/* Check static tiny sieve */ |
162
|
188552
|
100
|
|
|
|
|
if (d < NPRIME_SIEVE30) |
163
|
18329
|
100
|
|
|
|
|
return (prime_sieve30[d] & mtab) ? 0 : 2; |
164
|
|
|
|
|
|
|
|
165
|
170223
|
100
|
|
|
|
|
if (!(n%7) || !(n%11) || !(n%13)) return 0; |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
/* Check primary cache */ |
168
|
117147
|
100
|
|
|
|
|
if (n <= get_prime_cache(0,0)) { |
169
|
105267
|
|
|
|
|
|
int isprime = -1; |
170
|
105267
|
50
|
|
|
|
|
if (n <= get_prime_cache(0, &sieve)) |
171
|
105267
|
100
|
|
|
|
|
isprime = 2*((sieve[d] & mtab) == 0); |
172
|
|
|
|
|
|
|
release_prime_cache(sieve); |
173
|
105267
|
50
|
|
|
|
|
if (isprime >= 0) |
174
|
117147
|
|
|
|
|
|
return isprime; |
175
|
|
|
|
|
|
|
} |
176
|
|
|
|
|
|
|
} |
177
|
13802
|
|
|
|
|
|
return is_prob_prime(n); |
178
|
|
|
|
|
|
|
} |
179
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
|
181
|
25132
|
|
|
|
|
|
UV next_prime(UV n) |
182
|
|
|
|
|
|
|
{ |
183
|
|
|
|
|
|
|
UV m, next; |
184
|
|
|
|
|
|
|
|
185
|
25132
|
100
|
|
|
|
|
if (n < 30*NPRIME_SIEVE30) { |
186
|
18862
|
|
|
|
|
|
next = next_prime_in_sieve(prime_sieve30, n, 30*NPRIME_SIEVE30); |
187
|
18862
|
100
|
|
|
|
|
if (next != 0) return next; |
188
|
|
|
|
|
|
|
} |
189
|
|
|
|
|
|
|
|
190
|
6271
|
50
|
|
|
|
|
if (n >= MPU_MAX_PRIME) return 0; /* Overflow */ |
191
|
|
|
|
|
|
|
|
192
|
6271
|
100
|
|
|
|
|
if (n < get_prime_cache(0,0)) { |
193
|
|
|
|
|
|
|
const unsigned char* sieve; |
194
|
4068
|
|
|
|
|
|
UV sieve_size = get_prime_cache(0, &sieve); |
195
|
4068
|
50
|
|
|
|
|
next = (n < sieve_size) ? next_prime_in_sieve(sieve, n, sieve_size) : 0; |
196
|
|
|
|
|
|
|
release_prime_cache(sieve); |
197
|
4068
|
50
|
|
|
|
|
if (next != 0) return next; |
198
|
|
|
|
|
|
|
} |
199
|
|
|
|
|
|
|
|
200
|
2203
|
|
|
|
|
|
m = n % 30; |
201
|
|
|
|
|
|
|
do { /* Move forward one. */ |
202
|
9727
|
|
|
|
|
|
n += wheeladvance30[m]; |
203
|
9727
|
|
|
|
|
|
m = nextwheel30[m]; |
204
|
9727
|
100
|
|
|
|
|
} while (!is_prob_prime(n)); |
205
|
2203
|
|
|
|
|
|
return n; |
206
|
|
|
|
|
|
|
} |
207
|
|
|
|
|
|
|
|
208
|
|
|
|
|
|
|
|
209
|
28359
|
|
|
|
|
|
UV prev_prime(UV n) |
210
|
|
|
|
|
|
|
{ |
211
|
|
|
|
|
|
|
UV m, prev; |
212
|
|
|
|
|
|
|
|
213
|
28359
|
100
|
|
|
|
|
if (n < 30*NPRIME_SIEVE30) |
214
|
20172
|
|
|
|
|
|
return prev_prime_in_sieve(prime_sieve30, n); |
215
|
|
|
|
|
|
|
|
216
|
8187
|
100
|
|
|
|
|
if (n < get_prime_cache(0,0)) { |
217
|
|
|
|
|
|
|
const unsigned char* sieve; |
218
|
4023
|
|
|
|
|
|
UV sieve_size = get_prime_cache(0, &sieve); |
219
|
4023
|
50
|
|
|
|
|
prev = (n < sieve_size) ? prev_prime_in_sieve(sieve, n) : 0; |
220
|
|
|
|
|
|
|
release_prime_cache(sieve); |
221
|
4023
|
50
|
|
|
|
|
if (prev != 0) return prev; |
222
|
|
|
|
|
|
|
} |
223
|
|
|
|
|
|
|
|
224
|
4164
|
|
|
|
|
|
m = n % 30; |
225
|
|
|
|
|
|
|
do { /* Move back one. */ |
226
|
14269
|
|
|
|
|
|
n -= wheelretreat30[m]; |
227
|
14269
|
|
|
|
|
|
m = prevwheel30[m]; |
228
|
14269
|
100
|
|
|
|
|
} while (!is_prob_prime(n)); |
229
|
4164
|
|
|
|
|
|
return n; |
230
|
|
|
|
|
|
|
} |
231
|
|
|
|
|
|
|
|
232
|
|
|
|
|
|
|
/******************************************************************************/ |
233
|
|
|
|
|
|
|
/* PRINTING */ |
234
|
|
|
|
|
|
|
/******************************************************************************/ |
235
|
|
|
|
|
|
|
|
236
|
0
|
|
|
|
|
|
static int my_sprint(char* ptr, UV val) { |
237
|
|
|
|
|
|
|
int nchars; |
238
|
|
|
|
|
|
|
UV t; |
239
|
0
|
|
|
|
|
|
char *s = ptr; |
240
|
|
|
|
|
|
|
do { |
241
|
0
|
|
|
|
|
|
t = val / 10; *s++ = (char) ('0' + val - 10 * t); |
242
|
0
|
0
|
|
|
|
|
} while ((val = t)); |
243
|
0
|
|
|
|
|
|
nchars = s - ptr + 1; *s = '\n'; |
244
|
0
|
0
|
|
|
|
|
while (--s > ptr) { char c = *s; *s = *ptr; *ptr++ = c; } |
245
|
0
|
|
|
|
|
|
return nchars; |
246
|
|
|
|
|
|
|
} |
247
|
0
|
|
|
|
|
|
static char* write_buf(int fd, char* buf, char* bend) { |
248
|
0
|
|
|
|
|
|
int res = (int) write(fd, buf, bend-buf); |
249
|
0
|
0
|
|
|
|
|
if (res == -1) croak("print_primes write error"); |
250
|
0
|
|
|
|
|
|
return buf; |
251
|
|
|
|
|
|
|
} |
252
|
0
|
|
|
|
|
|
void print_primes(UV low, UV high, int fd) { |
253
|
|
|
|
|
|
|
char buf[8000+25]; |
254
|
0
|
|
|
|
|
|
char* bend = buf; |
255
|
0
|
0
|
|
|
|
|
if ((low <= 2) && (high >= 2)) bend += my_sprint(bend,2); |
|
|
0
|
|
|
|
|
|
256
|
0
|
0
|
|
|
|
|
if ((low <= 3) && (high >= 3)) bend += my_sprint(bend,3); |
|
|
0
|
|
|
|
|
|
257
|
0
|
0
|
|
|
|
|
if ((low <= 5) && (high >= 5)) bend += my_sprint(bend,5); |
|
|
0
|
|
|
|
|
|
258
|
0
|
0
|
|
|
|
|
if (low < 7) low = 7; |
259
|
|
|
|
|
|
|
|
260
|
0
|
0
|
|
|
|
|
if (low <= high) { |
261
|
|
|
|
|
|
|
unsigned char* segment; |
262
|
|
|
|
|
|
|
UV seg_base, seg_low, seg_high; |
263
|
0
|
|
|
|
|
|
void* ctx = start_segment_primes(low, high, &segment); |
264
|
0
|
0
|
|
|
|
|
while (next_segment_primes(ctx, &seg_base, &seg_low, &seg_high)) { |
265
|
0
|
0
|
|
|
|
|
START_DO_FOR_EACH_SIEVE_PRIME( segment, seg_base, seg_low, seg_high ) |
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
266
|
0
|
|
|
|
|
|
bend += my_sprint(bend,p); |
267
|
0
|
0
|
|
|
|
|
if (bend-buf > 8000) { bend = write_buf(fd, buf, bend); } |
268
|
0
|
|
|
|
|
|
END_DO_FOR_EACH_SIEVE_PRIME |
269
|
|
|
|
|
|
|
} |
270
|
0
|
|
|
|
|
|
end_segment_primes(ctx); |
271
|
|
|
|
|
|
|
} |
272
|
0
|
0
|
|
|
|
|
if (bend > buf) { bend = write_buf(fd, buf, bend); } |
273
|
0
|
|
|
|
|
|
} |
274
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
/******************************************************************************/ |
276
|
|
|
|
|
|
|
/* TOTIENT, MOEBIUS, MERTENS */ |
277
|
|
|
|
|
|
|
/******************************************************************************/ |
278
|
|
|
|
|
|
|
|
279
|
|
|
|
|
|
|
/* Return a char array with lo-hi+1 elements. mu[k-lo] = µ(k) for k = lo .. hi. |
280
|
|
|
|
|
|
|
* It is the callers responsibility to call Safefree on the result. */ |
281
|
|
|
|
|
|
|
#define PGTLO(ip,p,lo) ((ip)>=(lo)) ? (ip) : ((p)*((lo)/(p)) + (((lo)%(p))?(p):0)) |
282
|
69
|
|
|
|
|
|
signed char* range_moebius(UV lo, UV hi) |
283
|
|
|
|
|
|
|
{ |
284
|
|
|
|
|
|
|
signed char* mu; |
285
|
69
|
|
|
|
|
|
UV i, sqrtn = isqrt(hi), count = hi-lo+1; |
286
|
|
|
|
|
|
|
|
287
|
|
|
|
|
|
|
/* Kuznetsov indicates that the Deléglise & Rivat (1996) method can be |
288
|
|
|
|
|
|
|
* modified to work on logs, which allows us to operate with no |
289
|
|
|
|
|
|
|
* intermediate memory at all. Same time as the D&R method, less memory. */ |
290
|
|
|
|
|
|
|
unsigned char logp; |
291
|
|
|
|
|
|
|
UV nextlog, nextlogi; |
292
|
|
|
|
|
|
|
|
293
|
69
|
|
|
|
|
|
Newz(0, mu, count, signed char); |
294
|
69
|
100
|
|
|
|
|
if (sqrtn*sqrtn != hi && sqrtn < (UVCONST(1)<<(BITS_PER_WORD/2))-1) sqrtn++; |
|
|
50
|
|
|
|
|
|
295
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
/* For small ranges, do it by hand */ |
297
|
69
|
100
|
|
|
|
|
if (hi < 100 || count <= 10 || (hi > (1UL<<25) && count < icbrt(hi)/4)) { |
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
298
|
706
|
100
|
|
|
|
|
for (i = 0; i < count; i++) |
299
|
671
|
|
|
|
|
|
mu[i] = moebius(lo+i); |
300
|
35
|
|
|
|
|
|
return mu; |
301
|
|
|
|
|
|
|
} |
302
|
|
|
|
|
|
|
|
303
|
34
|
|
|
|
|
|
logp = 1; nextlog = 3; /* 2+1 */ |
304
|
438
|
50
|
|
|
|
|
START_DO_FOR_EACH_PRIME(2, sqrtn) { |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
305
|
404
|
|
|
|
|
|
UV p2 = p*p; |
306
|
404
|
100
|
|
|
|
|
if (p > nextlog) { |
307
|
77
|
|
|
|
|
|
logp += 2; /* logp is 1 | ceil(log(p)/log(2)) */ |
308
|
77
|
|
|
|
|
|
nextlog = ((nextlog-1)*4)+1; |
309
|
|
|
|
|
|
|
} |
310
|
146749
|
50
|
|
|
|
|
for (i = PGTLO(p, p, lo); i >= lo && i <= hi; i += p) |
|
|
0
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
311
|
146345
|
|
|
|
|
|
mu[i-lo] += logp; |
312
|
37943
|
50
|
|
|
|
|
for (i = PGTLO(p2, p2, lo); i >= lo && i <= hi; i += p2) |
|
|
0
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
313
|
37539
|
|
|
|
|
|
mu[i-lo] = 0x80; |
314
|
404
|
|
|
|
|
|
} END_DO_FOR_EACH_PRIME |
315
|
|
|
|
|
|
|
|
316
|
34
|
100
|
|
|
|
|
logp = log2floor(lo); |
317
|
34
|
|
|
|
|
|
nextlogi = (UVCONST(2) << logp) - lo; |
318
|
84025
|
100
|
|
|
|
|
for (i = 0; i < count; i++) { |
319
|
83991
|
|
|
|
|
|
unsigned char a = mu[i]; |
320
|
83991
|
100
|
|
|
|
|
if (i >= nextlogi) nextlogi = (UVCONST(2) << ++logp) - lo; |
321
|
83991
|
100
|
|
|
|
|
if (a & 0x80) { a = 0; } |
322
|
51111
|
100
|
|
|
|
|
else if (a >= logp) { a = 1 - 2*(a&1); } |
323
|
38965
|
|
|
|
|
|
else { a = -1 + 2*(a&1); } |
324
|
83991
|
|
|
|
|
|
mu[i] = a; |
325
|
|
|
|
|
|
|
} |
326
|
34
|
100
|
|
|
|
|
if (lo == 0) mu[0] = 0; |
327
|
|
|
|
|
|
|
|
328
|
34
|
|
|
|
|
|
return mu; |
329
|
|
|
|
|
|
|
} |
330
|
|
|
|
|
|
|
|
331
|
8
|
|
|
|
|
|
UV* range_totient(UV lo, UV hi) { |
332
|
|
|
|
|
|
|
UV* totients; |
333
|
8
|
|
|
|
|
|
UV i, seg_base, seg_low, seg_high, count = hi-lo+1; |
334
|
|
|
|
|
|
|
unsigned char* segment; |
335
|
|
|
|
|
|
|
void* ctx; |
336
|
|
|
|
|
|
|
|
337
|
8
|
50
|
|
|
|
|
if (hi < lo) croak("range_totient error hi %"UVuf" < lo %"UVuf"\n", hi, lo); |
338
|
8
|
50
|
|
|
|
|
New(0, totients, count, UV); |
339
|
|
|
|
|
|
|
|
340
|
|
|
|
|
|
|
/* Do via factoring if very small or if we have a small range */ |
341
|
8
|
100
|
|
|
|
|
if (hi < 100 || count <= 10 || hi/count > 1000) { |
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
342
|
41
|
100
|
|
|
|
|
for (i = 0; i < count; i++) |
343
|
35
|
|
|
|
|
|
totients[i] = totient(lo+i); |
344
|
6
|
|
|
|
|
|
return totients; |
345
|
|
|
|
|
|
|
} |
346
|
|
|
|
|
|
|
|
347
|
2
|
50
|
|
|
|
|
if (hi == UV_MAX) { |
348
|
0
|
|
|
|
|
|
totients[--count] = totient(UV_MAX); |
349
|
0
|
|
|
|
|
|
hi--; |
350
|
|
|
|
|
|
|
} |
351
|
|
|
|
|
|
|
|
352
|
|
|
|
|
|
|
/* If doing a full sieve, do it monolithic. Faster. */ |
353
|
2
|
100
|
|
|
|
|
if (lo == 0) { |
354
|
|
|
|
|
|
|
UV* prime; |
355
|
1
|
|
|
|
|
|
double loghi = log(hi); |
356
|
1
|
50
|
|
|
|
|
UV max_index = (hi < 67) ? 18 |
|
|
50
|
|
|
|
|
|
357
|
1
|
|
|
|
|
|
: (hi < 355991) ? 15+(hi/(loghi-1.09)) |
358
|
0
|
|
|
|
|
|
: (hi/loghi) * (1.0+1.0/loghi+2.51/(loghi*loghi)); |
359
|
1
|
|
|
|
|
|
UV j, index, nprimes = 0; |
360
|
|
|
|
|
|
|
|
361
|
1
|
50
|
|
|
|
|
New(0, prime, max_index, UV); /* could use prime_count_upper(hi) */ |
362
|
1
|
|
|
|
|
|
memset(totients, 0, count * sizeof(UV)); |
363
|
120
|
100
|
|
|
|
|
for (i = 2; i <= hi/2; i++) { |
364
|
119
|
|
|
|
|
|
index = 2*i; |
365
|
119
|
100
|
|
|
|
|
if ( !(i&1) ) { |
366
|
60
|
100
|
|
|
|
|
if (i == 2) { totients[2] = 1; prime[nprimes++] = 2; } |
367
|
60
|
|
|
|
|
|
totients[index] = totients[i]*2; |
368
|
|
|
|
|
|
|
} else { |
369
|
59
|
100
|
|
|
|
|
if (totients[i] == 0) { |
370
|
29
|
|
|
|
|
|
totients[i] = i-1; |
371
|
29
|
|
|
|
|
|
prime[nprimes++] = i; |
372
|
|
|
|
|
|
|
} |
373
|
167
|
50
|
|
|
|
|
for (j=0; j < nprimes && index <= hi; index = i*prime[++j]) { |
|
|
100
|
|
|
|
|
|
374
|
127
|
100
|
|
|
|
|
if (i % prime[j] == 0) { |
375
|
19
|
|
|
|
|
|
totients[index] = totients[i]*prime[j]; |
376
|
19
|
|
|
|
|
|
break; |
377
|
|
|
|
|
|
|
} else { |
378
|
108
|
|
|
|
|
|
totients[index] = totients[i]*(prime[j]-1); |
379
|
|
|
|
|
|
|
} |
380
|
|
|
|
|
|
|
} |
381
|
|
|
|
|
|
|
} |
382
|
|
|
|
|
|
|
} |
383
|
1
|
|
|
|
|
|
Safefree(prime); |
384
|
|
|
|
|
|
|
/* All totient values have been filled in except the primes. Mark them. */ |
385
|
61
|
100
|
|
|
|
|
for (i = ((hi/2) + 1) | 1; i <= hi; i += 2) |
386
|
60
|
100
|
|
|
|
|
if (totients[i] == 0) |
387
|
22
|
|
|
|
|
|
totients[i] = i-1; |
388
|
1
|
|
|
|
|
|
totients[1] = 1; |
389
|
1
|
|
|
|
|
|
totients[0] = 0; |
390
|
1
|
|
|
|
|
|
return totients; |
391
|
|
|
|
|
|
|
} |
392
|
|
|
|
|
|
|
|
393
|
26
|
100
|
|
|
|
|
for (i = 0; i < count; i++) { |
394
|
25
|
|
|
|
|
|
UV v = lo+i, nv = v; |
395
|
25
|
100
|
|
|
|
|
if (v % 2 == 0) nv -= nv/2; |
396
|
25
|
100
|
|
|
|
|
if (v % 3 == 0) nv -= nv/3; |
397
|
25
|
100
|
|
|
|
|
if (v % 5 == 0) nv -= nv/5; |
398
|
25
|
|
|
|
|
|
totients[i] = nv; |
399
|
|
|
|
|
|
|
} |
400
|
|
|
|
|
|
|
|
401
|
1
|
|
|
|
|
|
ctx = start_segment_primes(7, hi/2, &segment); |
402
|
2
|
100
|
|
|
|
|
while (next_segment_primes(ctx, &seg_base, &seg_low, &seg_high)) { |
403
|
137
|
50
|
|
|
|
|
START_DO_FOR_EACH_SIEVE_PRIME( segment, seg_base, seg_low, seg_high ) { |
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
404
|
163
|
100
|
|
|
|
|
for (i = PGTLO(2*p,p,lo); i >= lo && i <= hi; i += p) |
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
405
|
31
|
|
|
|
|
|
totients[i-lo] -= totients[i-lo]/p; |
406
|
4
|
|
|
|
|
|
} END_DO_FOR_EACH_SIEVE_PRIME |
407
|
|
|
|
|
|
|
} |
408
|
1
|
|
|
|
|
|
end_segment_primes(ctx); |
409
|
|
|
|
|
|
|
|
410
|
|
|
|
|
|
|
/* Fill in all primes */ |
411
|
14
|
100
|
|
|
|
|
for (i = (lo | 1) - lo; i < count; i += 2) |
412
|
13
|
100
|
|
|
|
|
if (totients[i] == i+lo) |
413
|
2
|
|
|
|
|
|
totients[i]--; |
414
|
1
|
50
|
|
|
|
|
if (lo <= 1) totients[1-lo] = 1; |
415
|
|
|
|
|
|
|
|
416
|
8
|
|
|
|
|
|
return totients; |
417
|
|
|
|
|
|
|
} |
418
|
|
|
|
|
|
|
|
419
|
45
|
|
|
|
|
|
IV mertens(UV n) { |
420
|
|
|
|
|
|
|
/* See Deléglise and Rivat (1996) for O(n^2/3 log(log(n))^1/3) algorithm. |
421
|
|
|
|
|
|
|
* This implementation uses their lemma 2.1 directly, so is ~ O(n). |
422
|
|
|
|
|
|
|
* In serial it is quite a bit faster than segmented summation of mu |
423
|
|
|
|
|
|
|
* ranges, though the latter seems to be a favored method for GPUs. |
424
|
|
|
|
|
|
|
*/ |
425
|
|
|
|
|
|
|
UV u, j, m, nmk, maxmu; |
426
|
|
|
|
|
|
|
signed char* mu; |
427
|
|
|
|
|
|
|
short* M; /* 16 bits is enough range for all 32-bit M => 64-bit n */ |
428
|
|
|
|
|
|
|
IV sum; |
429
|
|
|
|
|
|
|
|
430
|
45
|
100
|
|
|
|
|
if (n <= 1) return n; |
431
|
44
|
|
|
|
|
|
u = isqrt(n); |
432
|
44
|
|
|
|
|
|
maxmu = (n/(u+1)); /* maxmu lets us handle u < sqrt(n) */ |
433
|
44
|
100
|
|
|
|
|
if (maxmu < u) maxmu = u; |
434
|
44
|
|
|
|
|
|
mu = range_moebius(0, maxmu); |
435
|
44
|
50
|
|
|
|
|
New(0, M, maxmu+1, short); /* Works up to maxmu < 7613644886 */ |
436
|
44
|
|
|
|
|
|
M[0] = 0; |
437
|
56574
|
100
|
|
|
|
|
for (j = 1; j <= maxmu; j++) |
438
|
56530
|
|
|
|
|
|
M[j] = M[j-1] + mu[j]; |
439
|
44
|
|
|
|
|
|
sum = M[u]; |
440
|
56574
|
100
|
|
|
|
|
for (m = 1; m <= u; m++) { |
441
|
56530
|
100
|
|
|
|
|
if (mu[m] != 0) { |
442
|
34416
|
|
|
|
|
|
IV inner_sum = 0; |
443
|
34416
|
|
|
|
|
|
UV lower = (u/m) + 1; |
444
|
34416
|
|
|
|
|
|
UV last_nmk = n/(m*lower); |
445
|
34416
|
|
|
|
|
|
UV this_k = 0; |
446
|
34416
|
|
|
|
|
|
UV next_k = n/(m*1); |
447
|
34416
|
|
|
|
|
|
UV nmkm = m * 2; |
448
|
228957633
|
100
|
|
|
|
|
for (nmk = 1; nmk <= last_nmk; nmk++, nmkm += m) { |
449
|
228923217
|
|
|
|
|
|
this_k = next_k; |
450
|
228923217
|
|
|
|
|
|
next_k = n/nmkm; |
451
|
228923217
|
|
|
|
|
|
inner_sum += M[nmk] * (this_k - next_k); |
452
|
|
|
|
|
|
|
} |
453
|
34416
|
100
|
|
|
|
|
sum += (mu[m] > 0) ? -inner_sum : inner_sum; |
454
|
|
|
|
|
|
|
} |
455
|
|
|
|
|
|
|
} |
456
|
44
|
|
|
|
|
|
Safefree(M); |
457
|
44
|
|
|
|
|
|
Safefree(mu); |
458
|
44
|
|
|
|
|
|
return sum; |
459
|
|
|
|
|
|
|
} |
460
|
|
|
|
|
|
|
|
461
|
|
|
|
|
|
|
/******************************************************************************/ |
462
|
|
|
|
|
|
|
/* POWERS and ROOTS */ |
463
|
|
|
|
|
|
|
/******************************************************************************/ |
464
|
|
|
|
|
|
|
|
465
|
|
|
|
|
|
|
/* There are at least 4 ways to do this, plus hybrids. |
466
|
|
|
|
|
|
|
* 1) use a table. Great for 32-bit, too big for 64-bit. |
467
|
|
|
|
|
|
|
* 2) Use pow() to check. Relatively slow and FP is always dangerous. |
468
|
|
|
|
|
|
|
* 3) factor or trial factor. Slow for 64-bit. |
469
|
|
|
|
|
|
|
* 4) Dietzfelbinger algorithm 2.3.5. Quite slow. |
470
|
|
|
|
|
|
|
* This currently uses a hybrid of 1 and 2. |
471
|
|
|
|
|
|
|
*/ |
472
|
15369
|
|
|
|
|
|
int powerof(UV n) { |
473
|
|
|
|
|
|
|
UV t; |
474
|
15369
|
100
|
|
|
|
|
if ((n <= 3) || (n == UV_MAX)) return 1; |
|
|
50
|
|
|
|
|
|
475
|
15297
|
100
|
|
|
|
|
if ((n & (n-1)) == 0) return ctz(n); /* powers of 2 */ |
|
|
50
|
|
|
|
|
|
476
|
15282
|
100
|
|
|
|
|
if (is_perfect_square(n)) return 2 * powerof(isqrt(n)); |
477
|
15039
|
100
|
|
|
|
|
if (is_perfect_cube(n)) return 3 * powerof(icbrt(n)); |
478
|
|
|
|
|
|
|
|
479
|
|
|
|
|
|
|
/* Simple rejection filter for non-powers of 5-37. Rejects 47.85%. */ |
480
|
14989
|
100
|
|
|
|
|
t = n & 511; if ((t*77855451) & (t*4598053) & 862) return 1; |
481
|
|
|
|
|
|
|
|
482
|
6673
|
100
|
|
|
|
|
if (is_perfect_fifth(n)) return 5 * powerof(rootof(n,5)); |
483
|
6658
|
100
|
|
|
|
|
if (is_perfect_seventh(n)) return 7 * powerof(rootof(n,7)); |
484
|
|
|
|
|
|
|
|
485
|
6651
|
100
|
|
|
|
|
if (n > 177146 && n <= UVCONST(1977326743)) { |
|
|
100
|
|
|
|
|
|
486
|
1858
|
|
|
|
|
|
switch (n) { /* Check for powers of 11, 13, 17, 19 within 32 bits */ |
487
|
4
|
|
|
|
|
|
case 177147: case 48828125: case 362797056: case 1977326743: return 11; |
488
|
0
|
|
|
|
|
|
case 1594323: case 1220703125: return 13; |
489
|
0
|
|
|
|
|
|
case 129140163: return 17; |
490
|
0
|
|
|
|
|
|
case 1162261467: return 19; |
491
|
1854
|
|
|
|
|
|
default: break; |
492
|
|
|
|
|
|
|
} |
493
|
|
|
|
|
|
|
} |
494
|
|
|
|
|
|
|
#if BITS_PER_WORD == 64 |
495
|
6647
|
100
|
|
|
|
|
if (n >= UVCONST(8589934592)) { |
496
|
|
|
|
|
|
|
/* The Bloom filters reject about 90% of inputs each, about 99% for two. |
497
|
|
|
|
|
|
|
* Bach/Sorenson type sieves do about as well, but are much slower due |
498
|
|
|
|
|
|
|
* to using a powmod. */ |
499
|
163
|
100
|
|
|
|
|
if ( (t = n %121, !((t*19706187) & (t*61524433) & 876897796)) && |
|
|
50
|
|
|
|
|
|
500
|
2
|
|
|
|
|
|
(t = n % 89, !((t*28913398) & (t*69888189) & 2705511937U)) ) { |
501
|
|
|
|
|
|
|
/* (t = n % 67, !((t*117621317) & (t*48719734) & 537242019)) ) { */ |
502
|
0
|
|
|
|
|
|
UV root = rootof(n,11); |
503
|
0
|
0
|
|
|
|
|
if (n == ipow(root,11)) return 11; |
504
|
|
|
|
|
|
|
} |
505
|
163
|
100
|
|
|
|
|
if ( (t = n %131, !((t*1545928325) & (t*1355660813) & 2771533888U)) && |
|
|
100
|
|
|
|
|
|
506
|
26
|
|
|
|
|
|
(t = n % 79, !((t*48902028) & (t*48589927) & 404082779)) ) { |
507
|
|
|
|
|
|
|
/* (t = n % 53, !((t*79918293) & (t*236846524) & 694943819)) ) { */ |
508
|
2
|
|
|
|
|
|
UV root = rootof(n,13); |
509
|
2
|
50
|
|
|
|
|
if (n == ipow(root,13)) return 13; |
510
|
|
|
|
|
|
|
} |
511
|
161
|
|
|
|
|
|
switch (n) { |
512
|
|
|
|
|
|
|
case UVCONST(762939453125): |
513
|
|
|
|
|
|
|
case UVCONST(16926659444736): |
514
|
|
|
|
|
|
|
case UVCONST(232630513987207): |
515
|
|
|
|
|
|
|
case UVCONST(100000000000000000): |
516
|
|
|
|
|
|
|
case UVCONST(505447028499293771): |
517
|
|
|
|
|
|
|
case UVCONST(2218611106740436992): |
518
|
5
|
|
|
|
|
|
case UVCONST(8650415919381337933): return 17; |
519
|
|
|
|
|
|
|
case UVCONST(19073486328125): |
520
|
|
|
|
|
|
|
case UVCONST(609359740010496): |
521
|
|
|
|
|
|
|
case UVCONST(11398895185373143): |
522
|
4
|
|
|
|
|
|
case UVCONST(10000000000000000000): return 19; |
523
|
|
|
|
|
|
|
case UVCONST(94143178827): |
524
|
|
|
|
|
|
|
case UVCONST(11920928955078125): |
525
|
1
|
|
|
|
|
|
case UVCONST(789730223053602816): return 23; |
526
|
0
|
|
|
|
|
|
case UVCONST(68630377364883): return 29; |
527
|
0
|
|
|
|
|
|
case UVCONST(617673396283947): return 31; |
528
|
0
|
|
|
|
|
|
case UVCONST(450283905890997363): return 37; |
529
|
151
|
|
|
|
|
|
default: break; |
530
|
|
|
|
|
|
|
} |
531
|
|
|
|
|
|
|
} |
532
|
|
|
|
|
|
|
#endif |
533
|
6635
|
|
|
|
|
|
return 1; |
534
|
|
|
|
|
|
|
} |
535
|
10448
|
|
|
|
|
|
int is_power(UV n, UV a) |
536
|
|
|
|
|
|
|
{ |
537
|
|
|
|
|
|
|
int ret; |
538
|
10448
|
100
|
|
|
|
|
if (a > 0) { |
539
|
22
|
50
|
|
|
|
|
if (a == 1 || n <= 1) return 1; |
|
|
100
|
|
|
|
|
|
540
|
19
|
100
|
|
|
|
|
if ((a % 2) == 0) |
541
|
17
|
100
|
|
|
|
|
return !is_perfect_square(n) ? 0 : (a == 2) ? 1 : is_power(isqrt(n),a>>1); |
|
|
50
|
|
|
|
|
|
542
|
2
|
50
|
|
|
|
|
if ((a % 3) == 0) |
543
|
2
|
50
|
|
|
|
|
return !is_perfect_cube(n) ? 0 : (a == 3) ? 1 : is_power(icbrt(n),a/3); |
|
|
50
|
|
|
|
|
|
544
|
0
|
0
|
|
|
|
|
if ((a % 5) == 0) |
545
|
0
|
0
|
|
|
|
|
return !is_perfect_fifth(n) ? 0 : (a == 5) ? 1 :is_power(rootof(n,5),a/5); |
|
|
0
|
|
|
|
|
|
546
|
|
|
|
|
|
|
} |
547
|
10426
|
|
|
|
|
|
ret = powerof(n); |
548
|
10426
|
50
|
|
|
|
|
if (a != 0) return !(ret % a); /* Is the max power divisible by a? */ |
549
|
10426
|
100
|
|
|
|
|
return (ret == 1) ? 0 : ret; |
550
|
|
|
|
|
|
|
} |
551
|
|
|
|
|
|
|
|
552
|
|
|
|
|
|
|
#if BITS_PER_WORD == 64 |
553
|
|
|
|
|
|
|
#define ROOT_MAX_3 41 |
554
|
|
|
|
|
|
|
static const uint32_t root_max[ROOT_MAX_3] = {0,0,0,2642245,65535,7131,1625,565,255,138,84,56,40,30,23,19,15,13,11,10,9,8,7,6,6,5,5,5,4,4,4,4,3,3,3,3,3,3,3,3,3}; |
555
|
|
|
|
|
|
|
#else |
556
|
|
|
|
|
|
|
#define ROOT_MAX_3 21 |
557
|
|
|
|
|
|
|
static const uint32_t root_max[ROOT_MAX_3] = {0,0,0,1625,255,84,40,23,15,11,9,7,6,5,4,4,3,3,3,3,3}; |
558
|
|
|
|
|
|
|
#endif |
559
|
|
|
|
|
|
|
|
560
|
532
|
|
|
|
|
|
UV rootof(UV n, UV k) { |
561
|
|
|
|
|
|
|
UV lo, hi, max; |
562
|
532
|
50
|
|
|
|
|
if (k == 0) return 0; |
563
|
532
|
100
|
|
|
|
|
if (k == 1) return n; |
564
|
486
|
100
|
|
|
|
|
if (k == 2) return isqrt(n); |
565
|
364
|
100
|
|
|
|
|
if (k == 3) return icbrt(n); |
566
|
|
|
|
|
|
|
|
567
|
|
|
|
|
|
|
/* Bracket between powers of 2, but never exceed max power so ipow works */ |
568
|
352
|
100
|
|
|
|
|
max = 1 + ((k >= ROOT_MAX_3) ? 2 : root_max[k]); |
569
|
352
|
50
|
|
|
|
|
lo = UVCONST(1) << (log2floor(n)/k); |
570
|
352
|
|
|
|
|
|
hi = ((lo*2) < max) ? lo*2 : max; |
571
|
|
|
|
|
|
|
|
572
|
|
|
|
|
|
|
/* Binary search */ |
573
|
1225
|
100
|
|
|
|
|
while (lo < hi) { |
574
|
873
|
|
|
|
|
|
UV mid = lo + (hi-lo)/2; |
575
|
873
|
100
|
|
|
|
|
if (ipow(mid,k) <= n) lo = mid+1; |
576
|
394
|
|
|
|
|
|
else hi = mid; |
577
|
|
|
|
|
|
|
} |
578
|
352
|
|
|
|
|
|
return lo-1; |
579
|
|
|
|
|
|
|
} |
580
|
|
|
|
|
|
|
|
581
|
10274
|
|
|
|
|
|
int primepower(UV n, UV* prime) |
582
|
|
|
|
|
|
|
{ |
583
|
10274
|
|
|
|
|
|
int power = 0; |
584
|
10274
|
100
|
|
|
|
|
if (n < 2) return 0; |
585
|
|
|
|
|
|
|
/* Check for small divisors */ |
586
|
10268
|
100
|
|
|
|
|
if (!(n&1)) { |
587
|
24
|
100
|
|
|
|
|
if (n & (n-1)) return 0; |
588
|
9
|
|
|
|
|
|
*prime = 2; |
589
|
9
|
50
|
|
|
|
|
return ctz(n); |
590
|
|
|
|
|
|
|
} |
591
|
10244
|
100
|
|
|
|
|
if ((n%3) == 0) { |
592
|
|
|
|
|
|
|
/* if (UVCONST(12157665459056928801) % n) return 0; */ |
593
|
156
|
100
|
|
|
|
|
do { n /= 3; power++; } while (n > 1 && (n%3) == 0); |
|
|
100
|
|
|
|
|
|
594
|
15
|
100
|
|
|
|
|
if (n != 1) return 0; |
595
|
11
|
|
|
|
|
|
*prime = 3; |
596
|
11
|
|
|
|
|
|
return power; |
597
|
|
|
|
|
|
|
} |
598
|
10229
|
100
|
|
|
|
|
if ((n%5) == 0) { |
599
|
2573
|
100
|
|
|
|
|
do { n /= 5; power++; } while (n > 1 && (n%5) == 0); |
|
|
100
|
|
|
|
|
|
600
|
2007
|
100
|
|
|
|
|
if (n != 1) return 0; |
601
|
10
|
|
|
|
|
|
*prime = 5; |
602
|
10
|
|
|
|
|
|
return power; |
603
|
|
|
|
|
|
|
} |
604
|
8222
|
100
|
|
|
|
|
if ((n%7) == 0) { |
605
|
1403
|
100
|
|
|
|
|
do { n /= 7; power++; } while (n > 1 && (n%7) == 0); |
|
|
100
|
|
|
|
|
|
606
|
1149
|
100
|
|
|
|
|
if (n != 1) return 0; |
607
|
9
|
|
|
|
|
|
*prime = 7; |
608
|
9
|
|
|
|
|
|
return power; |
609
|
|
|
|
|
|
|
} |
610
|
7073
|
100
|
|
|
|
|
if (is_prob_prime(n)) |
611
|
2690
|
|
|
|
|
|
{ *prime = n; return 1; } |
612
|
|
|
|
|
|
|
/* Composite. Test for perfect power with prime root. */ |
613
|
4383
|
|
|
|
|
|
power = powerof(n); |
614
|
4383
|
100
|
|
|
|
|
if (power == 1) power = 0; |
615
|
4383
|
100
|
|
|
|
|
if (power) { |
616
|
121
|
|
|
|
|
|
UV root = rootof(n, (UV)power); |
617
|
121
|
100
|
|
|
|
|
if (is_prob_prime(root)) |
618
|
103
|
|
|
|
|
|
*prime = root; |
619
|
|
|
|
|
|
|
else |
620
|
18
|
|
|
|
|
|
power = 0; |
621
|
|
|
|
|
|
|
} |
622
|
4383
|
|
|
|
|
|
return power; |
623
|
|
|
|
|
|
|
} |
624
|
|
|
|
|
|
|
|
625
|
333
|
|
|
|
|
|
UV valuation(UV n, UV k) |
626
|
|
|
|
|
|
|
{ |
627
|
333
|
|
|
|
|
|
UV v = 0; |
628
|
333
|
|
|
|
|
|
UV kpower = k; |
629
|
333
|
100
|
|
|
|
|
if (k < 2 || n < 2) return 0; |
|
|
100
|
|
|
|
|
|
630
|
323
|
100
|
|
|
|
|
if (k == 2) return ctz(n); |
|
|
50
|
|
|
|
|
|
631
|
274
|
100
|
|
|
|
|
while ( !(n % kpower) ) { |
632
|
46
|
|
|
|
|
|
kpower *= k; |
633
|
46
|
|
|
|
|
|
v++; |
634
|
|
|
|
|
|
|
} |
635
|
228
|
|
|
|
|
|
return v; |
636
|
|
|
|
|
|
|
} |
637
|
|
|
|
|
|
|
|
638
|
601
|
|
|
|
|
|
UV logint(UV n, UV b) |
639
|
|
|
|
|
|
|
{ |
640
|
|
|
|
|
|
|
/* UV e; for (e=0; n; n /= b) e++; return e-1; */ |
641
|
601
|
|
|
|
|
|
UV v, e = 0; |
642
|
601
|
100
|
|
|
|
|
if (b == 2) |
643
|
200
|
50
|
|
|
|
|
return log2floor(n); |
644
|
401
|
50
|
|
|
|
|
if (n > UV_MAX/b) { |
645
|
0
|
|
|
|
|
|
n /= b; |
646
|
0
|
|
|
|
|
|
e = 1; |
647
|
|
|
|
|
|
|
} |
648
|
1541
|
100
|
|
|
|
|
for (v = b; v <= n; v *= b) |
649
|
1140
|
|
|
|
|
|
e++; |
650
|
401
|
|
|
|
|
|
return e; |
651
|
|
|
|
|
|
|
} |
652
|
|
|
|
|
|
|
|
653
|
2
|
|
|
|
|
|
UV mpu_popcount_string(const char* ptr, uint32_t len) |
654
|
|
|
|
|
|
|
{ |
655
|
2
|
|
|
|
|
|
uint32_t count = 0, i, j, d, v, power, slen, *s, *sptr; |
656
|
|
|
|
|
|
|
|
657
|
2
|
50
|
|
|
|
|
while (len > 0 && (*ptr == '0' || *ptr == '+' || *ptr == '-')) |
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
658
|
0
|
|
|
|
|
|
{ ptr++; len--; } |
659
|
|
|
|
|
|
|
|
660
|
|
|
|
|
|
|
/* Create s as array of base 10^8 numbers */ |
661
|
2
|
|
|
|
|
|
slen = (len + 7) / 8; |
662
|
2
|
50
|
|
|
|
|
Newz(0, s, slen, uint32_t); |
663
|
19
|
100
|
|
|
|
|
for (i = 0; i < slen; i++) { /* Chunks of 8 digits */ |
664
|
145
|
100
|
|
|
|
|
for (j = 0, d = 0, power = 1; j < 8 && len > 0; j++, power *= 10) { |
|
|
100
|
|
|
|
|
|
665
|
128
|
|
|
|
|
|
v = ptr[--len] - '0'; |
666
|
128
|
50
|
|
|
|
|
if (v > 9) croak("Parameter '%s' must be a positive integer",ptr); |
667
|
128
|
|
|
|
|
|
d += power * v; |
668
|
|
|
|
|
|
|
} |
669
|
17
|
|
|
|
|
|
s[slen - 1 - i] = d; |
670
|
|
|
|
|
|
|
} |
671
|
|
|
|
|
|
|
/* Repeatedly count and divide by 2 across s */ |
672
|
374
|
100
|
|
|
|
|
while (slen > 1) { |
673
|
372
|
100
|
|
|
|
|
if (s[slen-1] & 1) count++; |
674
|
372
|
|
|
|
|
|
sptr = s; |
675
|
372
|
100
|
|
|
|
|
if (s[0] == 1) { |
676
|
15
|
50
|
|
|
|
|
if (--slen == 0) break; |
677
|
15
|
|
|
|
|
|
*++sptr += 100000000; |
678
|
|
|
|
|
|
|
} |
679
|
2293
|
100
|
|
|
|
|
for (i = 0; i < slen; i++) { |
680
|
1921
|
100
|
|
|
|
|
if ( (i+1) < slen && sptr[i] & 1 ) sptr[i+1] += 100000000; |
|
|
100
|
|
|
|
|
|
681
|
1921
|
|
|
|
|
|
s[i] = sptr[i] >> 1; |
682
|
|
|
|
|
|
|
} |
683
|
|
|
|
|
|
|
} |
684
|
|
|
|
|
|
|
/* For final base 10^8 number just do naive popcnt */ |
685
|
56
|
100
|
|
|
|
|
for (d = s[0]; d > 0; d >>= 1) |
686
|
54
|
100
|
|
|
|
|
if (d & 1) |
687
|
25
|
|
|
|
|
|
count++; |
688
|
2
|
|
|
|
|
|
Safefree(s); |
689
|
2
|
|
|
|
|
|
return count; |
690
|
|
|
|
|
|
|
} |
691
|
|
|
|
|
|
|
|
692
|
|
|
|
|
|
|
|
693
|
|
|
|
|
|
|
/* How many times does 2 divide n? */ |
694
|
|
|
|
|
|
|
#define padic2(n) ctz(n) |
695
|
|
|
|
|
|
|
#define IS_MOD8_3OR5(x) (((x)&7)==3 || ((x)&7)==5) |
696
|
|
|
|
|
|
|
|
697
|
1165
|
|
|
|
|
|
static int kronecker_uu_sign(UV a, UV b, int s) { |
698
|
4542
|
100
|
|
|
|
|
while (a) { |
699
|
3377
|
50
|
|
|
|
|
int r = padic2(a); |
700
|
3377
|
100
|
|
|
|
|
if (r) { |
701
|
1583
|
100
|
|
|
|
|
if ((r&1) && IS_MOD8_3OR5(b)) s = -s; |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
702
|
1583
|
|
|
|
|
|
a >>= r; |
703
|
|
|
|
|
|
|
} |
704
|
3377
|
100
|
|
|
|
|
if (a & b & 2) s = -s; |
705
|
3377
|
|
|
|
|
|
{ UV t = b % a; b = a; a = t; } |
706
|
|
|
|
|
|
|
} |
707
|
1165
|
100
|
|
|
|
|
return (b == 1) ? s : 0; |
708
|
|
|
|
|
|
|
} |
709
|
|
|
|
|
|
|
|
710
|
1156
|
|
|
|
|
|
int kronecker_uu(UV a, UV b) { |
711
|
|
|
|
|
|
|
int r, s; |
712
|
1156
|
100
|
|
|
|
|
if (b & 1) return kronecker_uu_sign(a, b, 1); |
713
|
10
|
100
|
|
|
|
|
if (!(a&1)) return 0; |
714
|
7
|
|
|
|
|
|
s = 1; |
715
|
7
|
100
|
|
|
|
|
r = padic2(b); |
716
|
7
|
50
|
|
|
|
|
if (r) { |
717
|
7
|
100
|
|
|
|
|
if ((r&1) && IS_MOD8_3OR5(a)) s = -s; |
|
|
50
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
718
|
7
|
|
|
|
|
|
b >>= r; |
719
|
|
|
|
|
|
|
} |
720
|
7
|
|
|
|
|
|
return kronecker_uu_sign(a, b, s); |
721
|
|
|
|
|
|
|
} |
722
|
|
|
|
|
|
|
|
723
|
49
|
|
|
|
|
|
int kronecker_su(IV a, UV b) { |
724
|
|
|
|
|
|
|
int r, s; |
725
|
49
|
100
|
|
|
|
|
if (a >= 0) return kronecker_uu(a, b); |
726
|
14
|
100
|
|
|
|
|
if (b == 0) return (a == 1 || a == -1) ? 1 : 0; |
|
|
50
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
727
|
12
|
|
|
|
|
|
s = 1; |
728
|
12
|
50
|
|
|
|
|
r = padic2(b); |
729
|
12
|
100
|
|
|
|
|
if (r) { |
730
|
2
|
50
|
|
|
|
|
if (!(a&1)) return 0; |
731
|
2
|
50
|
|
|
|
|
if ((r&1) && IS_MOD8_3OR5(a)) s = -s; |
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
732
|
2
|
|
|
|
|
|
b >>= r; |
733
|
|
|
|
|
|
|
} |
734
|
12
|
|
|
|
|
|
a %= (IV) b; |
735
|
12
|
100
|
|
|
|
|
if (a < 0) a += b; |
736
|
12
|
|
|
|
|
|
return kronecker_uu_sign(a, b, s); |
737
|
|
|
|
|
|
|
} |
738
|
|
|
|
|
|
|
|
739
|
18
|
|
|
|
|
|
int kronecker_ss(IV a, IV b) { |
740
|
18
|
100
|
|
|
|
|
if (a >= 0 && b >= 0) |
|
|
50
|
|
|
|
|
|
741
|
0
|
0
|
|
|
|
|
return (b & 1) ? kronecker_uu_sign(a, b, 1) : kronecker_uu(a,b); |
742
|
18
|
100
|
|
|
|
|
if (b >= 0) |
743
|
7
|
|
|
|
|
|
return kronecker_su(a, b); |
744
|
11
|
100
|
|
|
|
|
return kronecker_su(a, -b) * ((a < 0) ? -1 : 1); |
745
|
|
|
|
|
|
|
} |
746
|
|
|
|
|
|
|
|
747
|
2752
|
|
|
|
|
|
UV factorial(UV n) { |
748
|
2752
|
|
|
|
|
|
UV i, r = 1; |
749
|
2752
|
100
|
|
|
|
|
if ( (n > 12 && sizeof(UV) <= 4) || (n > 20 && sizeof(UV) <= 8) ) return 0; |
750
|
16151
|
100
|
|
|
|
|
for (i = 2; i <= n; i++) |
751
|
13871
|
|
|
|
|
|
r *= i; |
752
|
2280
|
|
|
|
|
|
return r; |
753
|
|
|
|
|
|
|
} |
754
|
|
|
|
|
|
|
|
755
|
25124
|
|
|
|
|
|
UV binomial(UV n, UV k) { /* Thanks to MJD and RosettaCode for ideas */ |
756
|
25124
|
|
|
|
|
|
UV d, g, r = 1; |
757
|
25124
|
100
|
|
|
|
|
if (k == 0) return 1; |
758
|
24938
|
100
|
|
|
|
|
if (k == 1) return n; |
759
|
22904
|
100
|
|
|
|
|
if (k >= n) return (k == n); |
760
|
21351
|
100
|
|
|
|
|
if (k > n/2) k = n-k; |
761
|
213307
|
100
|
|
|
|
|
for (d = 1; d <= k; d++) { |
762
|
197192
|
100
|
|
|
|
|
if (r >= UV_MAX/n) { /* Possible overflow */ |
763
|
|
|
|
|
|
|
UV nr, dr; /* reduced numerator / denominator */ |
764
|
14824
|
|
|
|
|
|
g = gcd_ui(n, d); nr = n/g; dr = d/g; |
765
|
14824
|
|
|
|
|
|
g = gcd_ui(r, dr); r = r/g; dr = dr/g; |
766
|
14824
|
100
|
|
|
|
|
if (r >= UV_MAX/nr) return 0; /* Unavoidable overflow */ |
767
|
9588
|
|
|
|
|
|
r *= nr; |
768
|
9588
|
|
|
|
|
|
r /= dr; |
769
|
9588
|
|
|
|
|
|
n--; |
770
|
|
|
|
|
|
|
} else { |
771
|
182368
|
|
|
|
|
|
r *= n--; |
772
|
182368
|
|
|
|
|
|
r /= d; |
773
|
|
|
|
|
|
|
} |
774
|
|
|
|
|
|
|
} |
775
|
16115
|
|
|
|
|
|
return r; |
776
|
|
|
|
|
|
|
} |
777
|
|
|
|
|
|
|
|
778
|
190
|
|
|
|
|
|
UV stirling3(UV n, UV m) { /* Lah numbers */ |
779
|
|
|
|
|
|
|
UV f1, f2; |
780
|
|
|
|
|
|
|
|
781
|
190
|
50
|
|
|
|
|
if (m == n) return 1; |
782
|
190
|
50
|
|
|
|
|
if (n == 0 || m == 0 || m > n) return 0; |
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
783
|
190
|
100
|
|
|
|
|
if (m == 1) return factorial(n); |
784
|
|
|
|
|
|
|
|
785
|
171
|
|
|
|
|
|
f1 = binomial(n, m); |
786
|
171
|
50
|
|
|
|
|
if (f1 == 0) return 0; |
787
|
171
|
|
|
|
|
|
f2 = binomial(n-1, m-1); |
788
|
171
|
50
|
|
|
|
|
if (f2 == 0 || f1 >= UV_MAX/f2) return 0; |
|
|
50
|
|
|
|
|
|
789
|
171
|
|
|
|
|
|
f1 *= f2; |
790
|
171
|
|
|
|
|
|
f2 = factorial(n-m); |
791
|
171
|
50
|
|
|
|
|
if (f2 == 0 || f1 >= UV_MAX/f2) return 0; |
|
|
100
|
|
|
|
|
|
792
|
166
|
|
|
|
|
|
return f1 * f2; |
793
|
|
|
|
|
|
|
} |
794
|
|
|
|
|
|
|
|
795
|
1789
|
|
|
|
|
|
IV stirling2(UV n, UV m) { |
796
|
|
|
|
|
|
|
UV f; |
797
|
1789
|
|
|
|
|
|
IV j, k, t, s = 0; |
798
|
|
|
|
|
|
|
|
799
|
1789
|
50
|
|
|
|
|
if (m == n) return 1; |
800
|
1789
|
50
|
|
|
|
|
if (n == 0 || m == 0 || m > n) return 0; |
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
801
|
1789
|
100
|
|
|
|
|
if (m == 1) return 1; |
802
|
|
|
|
|
|
|
|
803
|
1549
|
100
|
|
|
|
|
if ((f = factorial(m)) == 0) return 0; |
804
|
7661
|
100
|
|
|
|
|
for (j = 1; j <= (IV)m; j++) { |
805
|
6586
|
|
|
|
|
|
t = binomial(m, j); |
806
|
121380
|
100
|
|
|
|
|
for (k = 1; k <= (IV)n; k++) { |
807
|
115103
|
50
|
|
|
|
|
if (t == 0 || j >= IV_MAX/t) return 0; |
|
|
100
|
|
|
|
|
|
808
|
114794
|
|
|
|
|
|
t *= j; |
809
|
|
|
|
|
|
|
} |
810
|
6277
|
100
|
|
|
|
|
if ((m-j) & 1) t *= -1; |
811
|
6277
|
|
|
|
|
|
s += t; |
812
|
|
|
|
|
|
|
} |
813
|
1075
|
|
|
|
|
|
return s/f; |
814
|
|
|
|
|
|
|
} |
815
|
|
|
|
|
|
|
|
816
|
192
|
|
|
|
|
|
IV stirling1(UV n, UV m) { |
817
|
192
|
|
|
|
|
|
IV k, t, b1, b2, s2, s = 0; |
818
|
|
|
|
|
|
|
|
819
|
192
|
50
|
|
|
|
|
if (m == n) return 1; |
820
|
192
|
50
|
|
|
|
|
if (n == 0 || m == 0 || m > n) return 0; |
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
821
|
192
|
100
|
|
|
|
|
if (m == 1) { |
822
|
19
|
|
|
|
|
|
UV f = factorial(n-1); |
823
|
19
|
50
|
|
|
|
|
if (f>(UV)IV_MAX) return 0; |
824
|
19
|
100
|
|
|
|
|
return (n&1) ? ((IV)f) : -((IV)f); |
825
|
|
|
|
|
|
|
} |
826
|
|
|
|
|
|
|
|
827
|
942
|
100
|
|
|
|
|
for (k = 1; k <= (IV)(n-m); k++) { |
828
|
816
|
|
|
|
|
|
b1 = binomial(k + n - 1, n - m + k); |
829
|
816
|
|
|
|
|
|
b2 = binomial(2 * n - m, n - m - k); |
830
|
816
|
|
|
|
|
|
s2 = stirling2(n - m + k, k); |
831
|
816
|
100
|
|
|
|
|
if (b1 == 0 || b2 == 0 || s2 == 0 || b1 > IV_MAX/b2) return 0; |
|
|
50
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
832
|
804
|
|
|
|
|
|
t = b1 * b2; |
833
|
804
|
100
|
|
|
|
|
if (s2 > IV_MAX/t) return 0; |
834
|
769
|
|
|
|
|
|
t *= s2; |
835
|
769
|
100
|
|
|
|
|
s += (k & 1) ? -t : t; |
836
|
|
|
|
|
|
|
} |
837
|
126
|
|
|
|
|
|
return s; |
838
|
|
|
|
|
|
|
} |
839
|
|
|
|
|
|
|
|
840
|
686
|
|
|
|
|
|
UV totient(UV n) { |
841
|
|
|
|
|
|
|
UV i, nfacs, totient, lastf, facs[MPU_MAX_FACTORS+1]; |
842
|
686
|
100
|
|
|
|
|
if (n <= 1) return n; |
843
|
590
|
|
|
|
|
|
totient = 1; |
844
|
|
|
|
|
|
|
/* phi(2m) = 2phi(m) if m even, phi(m) if m odd */ |
845
|
733
|
100
|
|
|
|
|
while ((n & 0x3) == 0) { n >>= 1; totient <<= 1; } |
846
|
590
|
100
|
|
|
|
|
if ((n & 0x1) == 0) { n >>= 1; } |
847
|
|
|
|
|
|
|
/* factor and calculate totient */ |
848
|
590
|
|
|
|
|
|
nfacs = factor(n, facs); |
849
|
590
|
|
|
|
|
|
lastf = 0; |
850
|
1213
|
100
|
|
|
|
|
for (i = 0; i < nfacs; i++) { |
851
|
623
|
|
|
|
|
|
UV f = facs[i]; |
852
|
623
|
100
|
|
|
|
|
if (f == lastf) { totient *= f; } |
853
|
576
|
|
|
|
|
|
else { totient *= f-1; lastf = f; } |
854
|
|
|
|
|
|
|
} |
855
|
686
|
|
|
|
|
|
return totient; |
856
|
|
|
|
|
|
|
} |
857
|
|
|
|
|
|
|
|
858
|
|
|
|
|
|
|
static const UV jordan_overflow[5] = |
859
|
|
|
|
|
|
|
#if BITS_PER_WORD == 64 |
860
|
|
|
|
|
|
|
{UVCONST(4294967311), 2642249, 65537, 7133, 1627}; |
861
|
|
|
|
|
|
|
#else |
862
|
|
|
|
|
|
|
{UVCONST( 65537), 1627, 257, 85, 41}; |
863
|
|
|
|
|
|
|
#endif |
864
|
490
|
|
|
|
|
|
UV jordan_totient(UV k, UV n) { |
865
|
|
|
|
|
|
|
UV factors[MPU_MAX_FACTORS+1]; |
866
|
|
|
|
|
|
|
int nfac, i; |
867
|
|
|
|
|
|
|
UV totient; |
868
|
490
|
50
|
|
|
|
|
if (k == 0 || n <= 1) return (n == 1); |
|
|
100
|
|
|
|
|
|
869
|
479
|
100
|
|
|
|
|
if (k > 6 || (k > 1 && n >= jordan_overflow[k-2])) return 0; |
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
870
|
|
|
|
|
|
|
|
871
|
457
|
|
|
|
|
|
totient = 1; |
872
|
|
|
|
|
|
|
/* Similar to Euler totient, shortcut even inputs */ |
873
|
662
|
100
|
|
|
|
|
while ((n & 0x3) == 0) { n >>= 1; totient *= (1<
|
874
|
457
|
100
|
|
|
|
|
if ((n & 0x1) == 0) { n >>= 1; totient *= ((1<
|
875
|
457
|
|
|
|
|
|
nfac = factor(n,factors); |
876
|
960
|
100
|
|
|
|
|
for (i = 0; i < nfac; i++) { |
877
|
503
|
|
|
|
|
|
UV p = factors[i]; |
878
|
503
|
|
|
|
|
|
UV pk = ipow(p,k); |
879
|
503
|
|
|
|
|
|
totient *= (pk-1); |
880
|
580
|
100
|
|
|
|
|
while (i+1 < nfac && p == factors[i+1]) { |
|
|
100
|
|
|
|
|
|
881
|
77
|
|
|
|
|
|
i++; |
882
|
77
|
|
|
|
|
|
totient *= pk; |
883
|
|
|
|
|
|
|
} |
884
|
|
|
|
|
|
|
} |
885
|
490
|
|
|
|
|
|
return totient; |
886
|
|
|
|
|
|
|
} |
887
|
|
|
|
|
|
|
|
888
|
270
|
|
|
|
|
|
UV carmichael_lambda(UV n) { |
889
|
|
|
|
|
|
|
UV fac[MPU_MAX_FACTORS+1]; |
890
|
|
|
|
|
|
|
int i, nfactors; |
891
|
270
|
|
|
|
|
|
UV lambda = 1; |
892
|
|
|
|
|
|
|
|
893
|
270
|
100
|
|
|
|
|
if (n < 8) return totient(n); |
894
|
262
|
100
|
|
|
|
|
if ((n & (n-1)) == 0) return n >> 2; |
895
|
|
|
|
|
|
|
|
896
|
253
|
50
|
|
|
|
|
i = ctz(n); |
897
|
253
|
100
|
|
|
|
|
if (i > 0) { |
898
|
95
|
|
|
|
|
|
n >>= i; |
899
|
95
|
100
|
|
|
|
|
lambda <<= (i>2) ? i-2 : i-1; |
900
|
|
|
|
|
|
|
} |
901
|
253
|
|
|
|
|
|
nfactors = factor(n, fac); |
902
|
600
|
100
|
|
|
|
|
for (i = 0; i < nfactors; i++) { |
903
|
347
|
|
|
|
|
|
UV p = fac[i], pk = p-1; |
904
|
394
|
100
|
|
|
|
|
while (i+1 < nfactors && p == fac[i+1]) { |
|
|
100
|
|
|
|
|
|
905
|
47
|
|
|
|
|
|
i++; |
906
|
47
|
|
|
|
|
|
pk *= p; |
907
|
|
|
|
|
|
|
} |
908
|
347
|
|
|
|
|
|
lambda = lcm_ui(lambda, pk); |
909
|
|
|
|
|
|
|
} |
910
|
270
|
|
|
|
|
|
return lambda; |
911
|
|
|
|
|
|
|
} |
912
|
|
|
|
|
|
|
|
913
|
20000
|
|
|
|
|
|
int is_carmichael(UV n) { |
914
|
|
|
|
|
|
|
UV fac[MPU_MAX_FACTORS+1]; |
915
|
|
|
|
|
|
|
UV exp[MPU_MAX_FACTORS+1]; |
916
|
|
|
|
|
|
|
int i, nfactors; |
917
|
|
|
|
|
|
|
|
918
|
|
|
|
|
|
|
/* Small or even is not a Carmichael number */ |
919
|
20000
|
100
|
|
|
|
|
if (n < 561 || !(n&1)) return 0; |
|
|
100
|
|
|
|
|
|
920
|
|
|
|
|
|
|
|
921
|
|
|
|
|
|
|
/* Simple pre-test for square free (odds only) */ |
922
|
9720
|
100
|
|
|
|
|
if (!(n% 9) || !(n%25) || !(n%49) || !(n%121) || !(n%169)) |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
923
|
1709
|
|
|
|
|
|
return 0; |
924
|
|
|
|
|
|
|
|
925
|
|
|
|
|
|
|
/* Check Korselt's criterion for small divisors */ |
926
|
8011
|
100
|
|
|
|
|
if (!(n% 5) && ((n-1) % 4 != 0)) return 0; |
|
|
100
|
|
|
|
|
|
927
|
7345
|
100
|
|
|
|
|
if (!(n% 7) && ((n-1) % 6 != 0)) return 0; |
|
|
100
|
|
|
|
|
|
928
|
6771
|
100
|
|
|
|
|
if (!(n%11) && ((n-1) % 10 != 0)) return 0; |
|
|
100
|
|
|
|
|
|
929
|
6333
|
100
|
|
|
|
|
if (!(n%13) && ((n-1) % 12 != 0)) return 0; |
|
|
100
|
|
|
|
|
|
930
|
5984
|
100
|
|
|
|
|
if (!(n%17) && ((n-1) % 16 != 0)) return 0; |
|
|
100
|
|
|
|
|
|
931
|
5678
|
100
|
|
|
|
|
if (!(n%19) && ((n-1) % 18 != 0)) return 0; |
|
|
100
|
|
|
|
|
|
932
|
5417
|
100
|
|
|
|
|
if (!(n%23) && ((n-1) % 22 != 0)) return 0; |
|
|
100
|
|
|
|
|
|
933
|
|
|
|
|
|
|
|
934
|
|
|
|
|
|
|
/* Fast check without having to factor */ |
935
|
5197
|
50
|
|
|
|
|
if (n > 5000000) { |
936
|
0
|
0
|
|
|
|
|
if (!(n%29) && ((n-1) % 28 != 0)) return 0; |
|
|
0
|
|
|
|
|
|
937
|
0
|
0
|
|
|
|
|
if (!(n%31) && ((n-1) % 30 != 0)) return 0; |
|
|
0
|
|
|
|
|
|
938
|
0
|
0
|
|
|
|
|
if (!(n%37) && ((n-1) % 36 != 0)) return 0; |
|
|
0
|
|
|
|
|
|
939
|
0
|
0
|
|
|
|
|
if (!(n%41) && ((n-1) % 40 != 0)) return 0; |
|
|
0
|
|
|
|
|
|
940
|
0
|
0
|
|
|
|
|
if (!(n%43) && ((n-1) % 42 != 0)) return 0; |
|
|
0
|
|
|
|
|
|
941
|
0
|
0
|
|
|
|
|
if (!is_pseudoprime(n,2)) return 0; |
942
|
|
|
|
|
|
|
} |
943
|
|
|
|
|
|
|
|
944
|
5197
|
|
|
|
|
|
nfactors = factor_exp(n, fac, exp); |
945
|
5197
|
100
|
|
|
|
|
if (nfactors < 3) |
946
|
4664
|
|
|
|
|
|
return 0; |
947
|
1330
|
100
|
|
|
|
|
for (i = 0; i < nfactors; i++) { |
948
|
1321
|
50
|
|
|
|
|
if (exp[i] > 1 || ((n-1) % (fac[i]-1)) != 0) |
|
|
100
|
|
|
|
|
|
949
|
524
|
|
|
|
|
|
return 0; |
950
|
|
|
|
|
|
|
} |
951
|
20000
|
|
|
|
|
|
return 1; |
952
|
|
|
|
|
|
|
} |
953
|
|
|
|
|
|
|
|
954
|
8230
|
|
|
|
|
|
static int is_quasi_base(int nfactors, UV *fac, UV p, UV b) { |
955
|
|
|
|
|
|
|
int i; |
956
|
13159
|
100
|
|
|
|
|
for (i = 0; i < nfactors; i++) { |
957
|
13015
|
|
|
|
|
|
UV d = fac[i] - b; |
958
|
13015
|
50
|
|
|
|
|
if (d == 0 || (p % d) != 0) |
|
|
100
|
|
|
|
|
|
959
|
8086
|
|
|
|
|
|
return 0; |
960
|
|
|
|
|
|
|
} |
961
|
144
|
|
|
|
|
|
return 1; |
962
|
|
|
|
|
|
|
} |
963
|
|
|
|
|
|
|
|
964
|
|
|
|
|
|
|
/* Returns number of bases that pass */ |
965
|
5402
|
|
|
|
|
|
UV is_quasi_carmichael(UV n) { |
966
|
|
|
|
|
|
|
UV nbases, fac[MPU_MAX_FACTORS+1], exp[MPU_MAX_FACTORS+1]; |
967
|
|
|
|
|
|
|
UV spf, lpf, ndivisors, *divs; |
968
|
|
|
|
|
|
|
int i, nfactors; |
969
|
|
|
|
|
|
|
|
970
|
5402
|
100
|
|
|
|
|
if (n < 35) return 0; |
971
|
|
|
|
|
|
|
|
972
|
|
|
|
|
|
|
/* Simple pre-test for square free */ |
973
|
5334
|
100
|
|
|
|
|
if (!(n% 4) || !(n% 9) || !(n%25) || !(n%49) || !(n%121) || !(n%169)) |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
974
|
2041
|
|
|
|
|
|
return 0; |
975
|
|
|
|
|
|
|
|
976
|
3293
|
|
|
|
|
|
nfactors = factor_exp(n, fac, exp); |
977
|
|
|
|
|
|
|
/* Must be composite */ |
978
|
3293
|
100
|
|
|
|
|
if (nfactors < 2) |
979
|
741
|
|
|
|
|
|
return 0; |
980
|
|
|
|
|
|
|
/* Must be square free */ |
981
|
8889
|
100
|
|
|
|
|
for (i = 0; i < nfactors; i++) |
982
|
6371
|
100
|
|
|
|
|
if (exp[i] > 1) |
983
|
34
|
|
|
|
|
|
return 0; |
984
|
|
|
|
|
|
|
|
985
|
2518
|
|
|
|
|
|
nbases = 0; |
986
|
2518
|
|
|
|
|
|
spf = fac[0]; |
987
|
2518
|
|
|
|
|
|
lpf = fac[nfactors-1]; |
988
|
|
|
|
|
|
|
|
989
|
|
|
|
|
|
|
/* Algorithm from Hiroaki Yamanouchi, 2015 */ |
990
|
2518
|
100
|
|
|
|
|
if (nfactors == 2) { |
991
|
1448
|
|
|
|
|
|
divs = _divisor_list(n / spf - 1, &ndivisors); |
992
|
7401
|
50
|
|
|
|
|
for (i = 0; i < (int)ndivisors; i++) { |
993
|
5953
|
|
|
|
|
|
UV d = divs[i]; |
994
|
5953
|
|
|
|
|
|
UV k = spf - d; |
995
|
5953
|
100
|
|
|
|
|
if (d >= spf) break; |
996
|
4505
|
100
|
|
|
|
|
if (is_quasi_base(nfactors, fac, n-k, k)) |
997
|
92
|
|
|
|
|
|
nbases++; |
998
|
|
|
|
|
|
|
} |
999
|
|
|
|
|
|
|
} else { |
1000
|
1070
|
|
|
|
|
|
divs = _divisor_list(lpf * (n / lpf - 1), &ndivisors); |
1001
|
9523
|
100
|
|
|
|
|
for (i = 0; i < (int)ndivisors; i++) { |
1002
|
8453
|
|
|
|
|
|
UV d = divs[i]; |
1003
|
8453
|
|
|
|
|
|
UV k = lpf - d; |
1004
|
8453
|
100
|
|
|
|
|
if (lpf > d && k >= spf) continue; |
|
|
100
|
|
|
|
|
|
1005
|
4795
|
100
|
|
|
|
|
if (k != 0 && is_quasi_base(nfactors, fac, n-k, k)) |
|
|
100
|
|
|
|
|
|
1006
|
52
|
|
|
|
|
|
nbases++; |
1007
|
|
|
|
|
|
|
} |
1008
|
|
|
|
|
|
|
} |
1009
|
2518
|
|
|
|
|
|
Safefree(divs); |
1010
|
5402
|
|
|
|
|
|
return nbases; |
1011
|
|
|
|
|
|
|
} |
1012
|
|
|
|
|
|
|
|
1013
|
80268
|
|
|
|
|
|
int is_semiprime(UV n) { |
1014
|
|
|
|
|
|
|
UV sp, p, n3, factors[2]; |
1015
|
|
|
|
|
|
|
|
1016
|
80268
|
100
|
|
|
|
|
if (n < 6) return (n == 4); |
1017
|
80256
|
100
|
|
|
|
|
if (!(n&1)) return !!is_prob_prime(n>>1); |
1018
|
40458
|
100
|
|
|
|
|
if (!(n%3)) return !!is_prob_prime(n/3); |
1019
|
27048
|
100
|
|
|
|
|
if (!(n%5)) return !!is_prob_prime(n/5); |
1020
|
|
|
|
|
|
|
/* 27% of random inputs left */ |
1021
|
21687
|
|
|
|
|
|
n3 = icbrt(n); |
1022
|
87163
|
100
|
|
|
|
|
for (sp = 4; sp < 60; sp++) { |
1023
|
87127
|
|
|
|
|
|
p = primes_tiny[sp]; |
1024
|
87127
|
100
|
|
|
|
|
if (p > n3) |
1025
|
15103
|
|
|
|
|
|
break; |
1026
|
72024
|
100
|
|
|
|
|
if ((n % p) == 0) |
1027
|
6548
|
|
|
|
|
|
return !!is_prob_prime(n/p); |
1028
|
|
|
|
|
|
|
} |
1029
|
|
|
|
|
|
|
/* 9.8% of random inputs left */ |
1030
|
15139
|
100
|
|
|
|
|
if (is_def_prime(n)) return 0; |
|
|
100
|
|
|
|
|
|
1031
|
5220
|
100
|
|
|
|
|
if (p > n3) return 1; /* past this, n is a composite and larger than p^3 */ |
1032
|
|
|
|
|
|
|
/* 4-8% of random inputs left */ |
1033
|
25
|
50
|
|
|
|
|
if (factor_one(n, factors, 0, 0) != 2) return 0; |
1034
|
80268
|
50
|
|
|
|
|
return (is_def_prime(factors[0]) && is_def_prime(factors[1])); |
|
|
50
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
1035
|
|
|
|
|
|
|
} |
1036
|
|
|
|
|
|
|
|
1037
|
102
|
|
|
|
|
|
int is_fundamental(UV n, int neg) { |
1038
|
102
|
|
|
|
|
|
UV r = n & 15; |
1039
|
102
|
100
|
|
|
|
|
if (r) { |
1040
|
94
|
100
|
|
|
|
|
if (!neg) { |
1041
|
47
|
|
|
|
|
|
switch (r & 3) { |
1042
|
9
|
100
|
|
|
|
|
case 0: return (r == 4) ? 0 : is_square_free(n >> 2); |
|
|
50
|
|
|
|
|
|
1043
|
13
|
|
|
|
|
|
case 1: return is_square_free(n); |
1044
|
25
|
|
|
|
|
|
default: break; |
1045
|
|
|
|
|
|
|
} |
1046
|
|
|
|
|
|
|
} else { |
1047
|
47
|
|
|
|
|
|
switch (r & 3) { |
1048
|
9
|
100
|
|
|
|
|
case 0: return (r == 12) ? 0 : is_square_free(n >> 2); |
|
|
100
|
|
|
|
|
|
1049
|
12
|
|
|
|
|
|
case 3: return is_square_free(n); |
1050
|
26
|
|
|
|
|
|
default: break; |
1051
|
|
|
|
|
|
|
} |
1052
|
|
|
|
|
|
|
} |
1053
|
|
|
|
|
|
|
} |
1054
|
59
|
|
|
|
|
|
return 0; |
1055
|
|
|
|
|
|
|
} |
1056
|
|
|
|
|
|
|
|
1057
|
461
|
|
|
|
|
|
static int _totpred(UV n, UV maxd) { |
1058
|
|
|
|
|
|
|
UV i, ndivisors, *divs; |
1059
|
|
|
|
|
|
|
int res; |
1060
|
|
|
|
|
|
|
|
1061
|
461
|
100
|
|
|
|
|
if (n & 1) return 0; |
1062
|
255
|
|
|
|
|
|
n >>= 1; |
1063
|
255
|
100
|
|
|
|
|
if (n == 1) return 1; |
1064
|
249
|
100
|
|
|
|
|
if (n < maxd && is_prime(2*n+1)) return 1; |
|
|
100
|
|
|
|
|
|
1065
|
|
|
|
|
|
|
|
1066
|
230
|
|
|
|
|
|
divs = _divisor_list(n, &ndivisors); |
1067
|
1086
|
100
|
|
|
|
|
for (i = 0, res = 0; i < ndivisors && divs[i] < maxd && res == 0; i++) { |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
1068
|
856
|
|
|
|
|
|
UV r, d = divs[i], p = 2*d+1; |
1069
|
856
|
100
|
|
|
|
|
if (!is_prime(p)) continue; |
1070
|
349
|
|
|
|
|
|
r = n/d; |
1071
|
|
|
|
|
|
|
while (1) { |
1072
|
401
|
100
|
|
|
|
|
if (r == p || _totpred(r, d)) { res = 1; break; } |
|
|
100
|
|
|
|
|
|
1073
|
385
|
100
|
|
|
|
|
if (r % p) break; |
1074
|
52
|
|
|
|
|
|
r /= p; |
1075
|
52
|
|
|
|
|
|
} |
1076
|
|
|
|
|
|
|
} |
1077
|
230
|
|
|
|
|
|
Safefree(divs); |
1078
|
461
|
|
|
|
|
|
return res; |
1079
|
|
|
|
|
|
|
} |
1080
|
|
|
|
|
|
|
|
1081
|
124
|
|
|
|
|
|
int is_totient(UV n) { |
1082
|
124
|
100
|
|
|
|
|
return (n == 0 || (n & 1)) ? (n==1) : _totpred(n,n); |
|
|
100
|
|
|
|
|
|
1083
|
|
|
|
|
|
|
} |
1084
|
|
|
|
|
|
|
|
1085
|
|
|
|
|
|
|
|
1086
|
103
|
|
|
|
|
|
UV inverse_totient_count(UV n) { |
1087
|
|
|
|
|
|
|
set_t set, sumset; |
1088
|
|
|
|
|
|
|
keyval_t keyval; |
1089
|
|
|
|
|
|
|
UV res, i, ndivisors, *divs; |
1090
|
|
|
|
|
|
|
|
1091
|
103
|
100
|
|
|
|
|
if (n == 1) return 2; |
1092
|
102
|
100
|
|
|
|
|
if (n < 1 || n & 1) return 0; |
|
|
100
|
|
|
|
|
|
1093
|
52
|
100
|
|
|
|
|
if (is_prime(n >> 1)) { /* Coleman Remark 3.3 (Thm 3.1) and Prop 6.2 */ |
1094
|
15
|
100
|
|
|
|
|
if (!is_prime(n+1)) return 0; |
1095
|
7
|
100
|
|
|
|
|
if (n >= 10) return 2; |
1096
|
|
|
|
|
|
|
} |
1097
|
|
|
|
|
|
|
|
1098
|
39
|
|
|
|
|
|
divs = _divisor_list(n, &ndivisors); |
1099
|
|
|
|
|
|
|
|
1100
|
39
|
|
|
|
|
|
init_set(&set, 2*ndivisors); |
1101
|
39
|
|
|
|
|
|
keyval.key = 1; keyval.val = 1; |
1102
|
39
|
|
|
|
|
|
set_addsum(&set, keyval); |
1103
|
|
|
|
|
|
|
|
1104
|
502
|
100
|
|
|
|
|
for (i = 0; i < ndivisors; i++) { |
1105
|
463
|
|
|
|
|
|
UV d = divs[i], p = d+1; |
1106
|
463
|
100
|
|
|
|
|
if (is_prime(p)) { |
1107
|
245
|
|
|
|
|
|
UV j, np = d, v = valuation(n, p); |
1108
|
245
|
|
|
|
|
|
init_set(&sumset, ndivisors/2); |
1109
|
626
|
100
|
|
|
|
|
for (j = 0; j <= v; j++) { |
1110
|
381
|
|
|
|
|
|
UV k, ndiv = n/np; /* Loop over divisors of n/np */ |
1111
|
381
|
100
|
|
|
|
|
if (np == 1) { |
1112
|
39
|
|
|
|
|
|
keyval_t kv; kv.key = 1; kv.val = 1; |
1113
|
39
|
|
|
|
|
|
set_addsum(&sumset, kv); |
1114
|
|
|
|
|
|
|
} else { |
1115
|
8912
|
50
|
|
|
|
|
for (k = 0; k < ndivisors && divs[k] <= ndiv; k++) { |
|
|
100
|
|
|
|
|
|
1116
|
8570
|
|
|
|
|
|
UV val, d2 = divs[k]; |
1117
|
8570
|
100
|
|
|
|
|
if ((ndiv % d2) != 0) continue; |
1118
|
4078
|
|
|
|
|
|
val = set_getval(set, d2); |
1119
|
4078
|
100
|
|
|
|
|
if (val > 0) { |
1120
|
1896
|
|
|
|
|
|
keyval_t kv; kv.key = d2*np; kv.val = val; |
1121
|
1896
|
|
|
|
|
|
set_addsum(&sumset, kv); |
1122
|
|
|
|
|
|
|
} |
1123
|
|
|
|
|
|
|
} |
1124
|
|
|
|
|
|
|
} |
1125
|
|
|
|
|
|
|
/* if (j < v && np > UV_MAX/p) croak("overflow np d %lu", d); */ |
1126
|
381
|
|
|
|
|
|
np *= p; |
1127
|
|
|
|
|
|
|
} |
1128
|
245
|
|
|
|
|
|
set_merge(&set, sumset); |
1129
|
245
|
|
|
|
|
|
free_set(&sumset); |
1130
|
|
|
|
|
|
|
} |
1131
|
|
|
|
|
|
|
} |
1132
|
39
|
|
|
|
|
|
Safefree(divs); |
1133
|
39
|
|
|
|
|
|
res = set_getval(set, n); |
1134
|
39
|
|
|
|
|
|
free_set(&set); |
1135
|
103
|
|
|
|
|
|
return res; |
1136
|
|
|
|
|
|
|
} |
1137
|
|
|
|
|
|
|
|
1138
|
2
|
|
|
|
|
|
UV* inverse_totient_list(UV *ntotients, UV n) { |
1139
|
|
|
|
|
|
|
set_list_t setlist, divlist; |
1140
|
|
|
|
|
|
|
UV i, ndivisors, *divs, *tlist; |
1141
|
2
|
|
|
|
|
|
UV *totlist = 0; |
1142
|
|
|
|
|
|
|
|
1143
|
2
|
50
|
|
|
|
|
MPUassert(n <= UV_MAX/7.5, "inverse_totient_list n too large"); |
1144
|
|
|
|
|
|
|
|
1145
|
2
|
50
|
|
|
|
|
if (n == 1) { |
1146
|
0
|
|
|
|
|
|
New(0, totlist, 2, UV); |
1147
|
0
|
|
|
|
|
|
totlist[0] = 1; totlist[1] = 2; |
1148
|
0
|
|
|
|
|
|
*ntotients = 2; |
1149
|
0
|
|
|
|
|
|
return totlist; |
1150
|
|
|
|
|
|
|
} |
1151
|
2
|
50
|
|
|
|
|
if (n < 1 || n & 1) { |
|
|
50
|
|
|
|
|
|
1152
|
0
|
|
|
|
|
|
*ntotients = 0; |
1153
|
0
|
|
|
|
|
|
return totlist; |
1154
|
|
|
|
|
|
|
} |
1155
|
2
|
50
|
|
|
|
|
if (is_prime(n >> 1)) { /* Coleman Remark 3.3 (Thm 3.1) and Prop 6.2 */ |
1156
|
0
|
0
|
|
|
|
|
if (!is_prime(n+1)) { |
1157
|
0
|
|
|
|
|
|
*ntotients = 0; |
1158
|
0
|
|
|
|
|
|
return totlist; |
1159
|
|
|
|
|
|
|
} |
1160
|
0
|
0
|
|
|
|
|
if (n >= 10) { |
1161
|
0
|
|
|
|
|
|
New(0, totlist, 2, UV); |
1162
|
0
|
|
|
|
|
|
totlist[0] = n+1; totlist[1] = 2*n+2; |
1163
|
0
|
|
|
|
|
|
*ntotients = 2; |
1164
|
0
|
|
|
|
|
|
return totlist; |
1165
|
|
|
|
|
|
|
} |
1166
|
|
|
|
|
|
|
} |
1167
|
|
|
|
|
|
|
|
1168
|
2
|
|
|
|
|
|
divs = _divisor_list(n, &ndivisors); |
1169
|
|
|
|
|
|
|
|
1170
|
2
|
|
|
|
|
|
init_setlist(&setlist, 2*ndivisors); |
1171
|
2
|
|
|
|
|
|
setlist_addval(&setlist, 1, 1); /* Add 1 => [1] */ |
1172
|
|
|
|
|
|
|
|
1173
|
74
|
100
|
|
|
|
|
for (i = 0; i < ndivisors; i++) { |
1174
|
72
|
|
|
|
|
|
UV d = divs[i], p = d+1; |
1175
|
72
|
100
|
|
|
|
|
if (is_prime(p)) { |
1176
|
23
|
|
|
|
|
|
UV j, dp = d, pp = p, v = valuation(n, p); |
1177
|
23
|
|
|
|
|
|
init_setlist(&divlist, ndivisors/2); |
1178
|
56
|
100
|
|
|
|
|
for (j = 0; j <= v; j++) { |
1179
|
33
|
|
|
|
|
|
UV k, ndiv = n/dp; /* Loop over divisors of n/dp */ |
1180
|
33
|
100
|
|
|
|
|
if (dp == 1) { |
1181
|
2
|
|
|
|
|
|
setlist_addval(&divlist, 1, 2); /* Add 1 => [2] */ |
1182
|
|
|
|
|
|
|
} else { |
1183
|
888
|
50
|
|
|
|
|
for (k = 0; k < ndivisors && divs[k] <= ndiv; k++) { |
|
|
100
|
|
|
|
|
|
1184
|
857
|
|
|
|
|
|
UV nvals, *vals, d2 = divs[k]; |
1185
|
857
|
100
|
|
|
|
|
if ((ndiv % d2) != 0) continue; |
1186
|
406
|
|
|
|
|
|
vals = setlist_getlist(&nvals, setlist, d2); |
1187
|
406
|
100
|
|
|
|
|
if (vals != 0) |
1188
|
406
|
|
|
|
|
|
setlist_addlist(&divlist, d2 * dp, nvals, vals, pp); |
1189
|
|
|
|
|
|
|
} |
1190
|
|
|
|
|
|
|
} |
1191
|
33
|
|
|
|
|
|
dp *= p; |
1192
|
33
|
|
|
|
|
|
pp *= p; |
1193
|
|
|
|
|
|
|
} |
1194
|
23
|
|
|
|
|
|
setlist_merge(&setlist, divlist); |
1195
|
23
|
|
|
|
|
|
free_setlist(&divlist); |
1196
|
|
|
|
|
|
|
} |
1197
|
|
|
|
|
|
|
} |
1198
|
2
|
|
|
|
|
|
Safefree(divs); |
1199
|
2
|
|
|
|
|
|
tlist = setlist_getlist(ntotients, setlist, n); |
1200
|
2
|
50
|
|
|
|
|
if (tlist != 0 && *ntotients > 0) { |
|
|
50
|
|
|
|
|
|
1201
|
2
|
50
|
|
|
|
|
New(0, totlist, *ntotients, UV); |
1202
|
2
|
|
|
|
|
|
memcpy(totlist, tlist, *ntotients * sizeof(UV)); |
1203
|
2
|
|
|
|
|
|
qsort(totlist, *ntotients, sizeof(UV), _numcmp); |
1204
|
|
|
|
|
|
|
} |
1205
|
2
|
|
|
|
|
|
free_setlist(&setlist); |
1206
|
2
|
|
|
|
|
|
return totlist; |
1207
|
|
|
|
|
|
|
} |
1208
|
|
|
|
|
|
|
|
1209
|
|
|
|
|
|
|
|
1210
|
993
|
|
|
|
|
|
UV pillai_v(UV n) { |
1211
|
|
|
|
|
|
|
UV v, fac; |
1212
|
993
|
100
|
|
|
|
|
if (n == 0) return 0; |
1213
|
104101
|
100
|
|
|
|
|
for (v = 8, fac = 5040 % n; v < n-1 && fac != 0; v++) { |
|
|
100
|
|
|
|
|
|
1214
|
103194
|
50
|
|
|
|
|
fac = (n < HALF_WORD) ? (fac*v) % n : mulmod(fac,v,n); |
1215
|
103194
|
100
|
|
|
|
|
if (fac == n-1 && (n % v) != 1) |
|
|
100
|
|
|
|
|
|
1216
|
85
|
|
|
|
|
|
return v; |
1217
|
|
|
|
|
|
|
} |
1218
|
907
|
|
|
|
|
|
return 0; |
1219
|
|
|
|
|
|
|
} |
1220
|
|
|
|
|
|
|
|
1221
|
|
|
|
|
|
|
|
1222
|
29732
|
|
|
|
|
|
int moebius(UV n) { |
1223
|
|
|
|
|
|
|
UV factors[MPU_MAX_FACTORS+1]; |
1224
|
|
|
|
|
|
|
int i, nfactors; |
1225
|
|
|
|
|
|
|
|
1226
|
29732
|
100
|
|
|
|
|
if (n <= 5) return (n == 1) ? 1 : (n % 4) ? -1 : 0; |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
1227
|
28856
|
100
|
|
|
|
|
if (n >= 49 && (!(n % 4) || !(n % 9) || !(n % 25) || !(n % 49))) |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
1228
|
10111
|
|
|
|
|
|
return 0; |
1229
|
18745
|
100
|
|
|
|
|
if (n >= 361 && (!(n % 121) || !(n % 169) || !(n % 289) || !(n % 361))) |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
1230
|
322
|
|
|
|
|
|
return 0; |
1231
|
18423
|
100
|
|
|
|
|
if (n >= 961 && (!(n % 529) || !(n % 841) || !(n % 961))) |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
1232
|
63
|
|
|
|
|
|
return 0; |
1233
|
|
|
|
|
|
|
|
1234
|
18360
|
|
|
|
|
|
nfactors = factor(n, factors); |
1235
|
38637
|
100
|
|
|
|
|
for (i = 1; i < nfactors; i++) |
1236
|
21038
|
100
|
|
|
|
|
if (factors[i] == factors[i-1]) |
1237
|
761
|
|
|
|
|
|
return 0; |
1238
|
29732
|
100
|
|
|
|
|
return (nfactors % 2) ? -1 : 1; |
1239
|
|
|
|
|
|
|
} |
1240
|
|
|
|
|
|
|
|
1241
|
20
|
|
|
|
|
|
UV exp_mangoldt(UV n) { |
1242
|
|
|
|
|
|
|
UV p; |
1243
|
20
|
100
|
|
|
|
|
if (!primepower(n,&p)) return 1; /* Not a prime power */ |
1244
|
20
|
|
|
|
|
|
return p; |
1245
|
|
|
|
|
|
|
} |
1246
|
|
|
|
|
|
|
|
1247
|
|
|
|
|
|
|
|
1248
|
75
|
|
|
|
|
|
UV znorder(UV a, UV n) { |
1249
|
|
|
|
|
|
|
UV fac[MPU_MAX_FACTORS+1]; |
1250
|
|
|
|
|
|
|
UV exp[MPU_MAX_FACTORS+1]; |
1251
|
|
|
|
|
|
|
int i, nfactors; |
1252
|
|
|
|
|
|
|
UV k, phi; |
1253
|
|
|
|
|
|
|
|
1254
|
75
|
100
|
|
|
|
|
if (n <= 1) return n; /* znorder(x,0) = 0, znorder(x,1) = 1 */ |
1255
|
69
|
100
|
|
|
|
|
if (a <= 1) return a; /* znorder(0,x) = 0, znorder(1,x) = 1 (x > 1) */ |
1256
|
66
|
100
|
|
|
|
|
if (gcd_ui(a,n) > 1) return 0; |
1257
|
|
|
|
|
|
|
|
1258
|
|
|
|
|
|
|
/* Cohen 1.4.3 using Carmichael Lambda */ |
1259
|
60
|
|
|
|
|
|
phi = carmichael_lambda(n); |
1260
|
60
|
|
|
|
|
|
nfactors = factor_exp(phi, fac, exp); |
1261
|
60
|
|
|
|
|
|
k = phi; |
1262
|
|
|
|
|
|
|
#if USE_MONTMATH |
1263
|
60
|
100
|
|
|
|
|
if (n & 1) { |
1264
|
54
|
|
|
|
|
|
const uint64_t npi = mont_inverse(n), mont1 = mont_get1(n); |
1265
|
54
|
|
|
|
|
|
UV ma = mont_geta(a, n); |
1266
|
266
|
100
|
|
|
|
|
for (i = 0; i < nfactors; i++) { |
1267
|
212
|
|
|
|
|
|
UV b, a1, ek, pi = fac[i], ei = exp[i]; |
1268
|
212
|
|
|
|
|
|
b = ipow(pi,ei); |
1269
|
212
|
|
|
|
|
|
k /= b; |
1270
|
212
|
|
|
|
|
|
a1 = mont_powmod(ma, k, n); |
1271
|
373
|
100
|
|
|
|
|
for (ek = 0; a1 != mont1 && ek++ <= ei; a1 = mont_powmod(a1, pi, n)) |
|
|
50
|
|
|
|
|
|
1272
|
161
|
|
|
|
|
|
k *= pi; |
1273
|
212
|
50
|
|
|
|
|
if (ek > ei) return 0; |
1274
|
|
|
|
|
|
|
} |
1275
|
|
|
|
|
|
|
} else |
1276
|
|
|
|
|
|
|
#endif |
1277
|
13
|
100
|
|
|
|
|
for (i = 0; i < nfactors; i++) { |
1278
|
7
|
|
|
|
|
|
UV b, a1, ek, pi = fac[i], ei = exp[i]; |
1279
|
7
|
|
|
|
|
|
b = ipow(pi,ei); |
1280
|
7
|
|
|
|
|
|
k /= b; |
1281
|
7
|
|
|
|
|
|
a1 = powmod(a, k, n); |
1282
|
14
|
100
|
|
|
|
|
for (ek = 0; a1 != 1 && ek++ <= ei; a1 = powmod(a1, pi, n)) |
|
|
50
|
|
|
|
|
|
1283
|
7
|
|
|
|
|
|
k *= pi; |
1284
|
7
|
50
|
|
|
|
|
if (ek > ei) return 0; |
1285
|
|
|
|
|
|
|
} |
1286
|
75
|
|
|
|
|
|
return k; |
1287
|
|
|
|
|
|
|
} |
1288
|
|
|
|
|
|
|
|
1289
|
25
|
|
|
|
|
|
UV znprimroot(UV n) { |
1290
|
|
|
|
|
|
|
UV fac[MPU_MAX_FACTORS+1]; |
1291
|
|
|
|
|
|
|
UV phi_div_fac[MPU_MAX_FACTORS+1]; |
1292
|
|
|
|
|
|
|
UV a, phi, on, r; |
1293
|
|
|
|
|
|
|
int i, nfactors; |
1294
|
|
|
|
|
|
|
|
1295
|
25
|
100
|
|
|
|
|
if (n <= 4) return (n == 0) ? 0 : n-1; |
|
|
100
|
|
|
|
|
|
1296
|
20
|
100
|
|
|
|
|
if (n % 4 == 0) return 0; |
1297
|
|
|
|
|
|
|
|
1298
|
19
|
100
|
|
|
|
|
on = (n&1) ? n : (n>>1); |
1299
|
19
|
|
|
|
|
|
a = powerof(on); |
1300
|
19
|
|
|
|
|
|
r = rootof(on, a); |
1301
|
19
|
100
|
|
|
|
|
if (!is_prob_prime(r)) return 0; /* c^a or 2c^a */ |
1302
|
17
|
|
|
|
|
|
phi = (r-1) * (on/r); /* p^a or 2p^a */ |
1303
|
|
|
|
|
|
|
|
1304
|
17
|
|
|
|
|
|
nfactors = factor_exp(phi, fac, 0); |
1305
|
83
|
100
|
|
|
|
|
for (i = 0; i < nfactors; i++) |
1306
|
66
|
|
|
|
|
|
phi_div_fac[i] = phi / fac[i]; |
1307
|
|
|
|
|
|
|
|
1308
|
|
|
|
|
|
|
#if USE_MONTMATH |
1309
|
17
|
100
|
|
|
|
|
if (n & 1) { |
1310
|
14
|
|
|
|
|
|
const uint64_t npi = mont_inverse(n), mont1 = mont_get1(n); |
1311
|
834
|
50
|
|
|
|
|
for (a = 2; a < n; a++) { |
1312
|
834
|
100
|
|
|
|
|
if (a == 4 || a == 8 || a == 9) continue; /* Skip some perfect powers */ |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
1313
|
|
|
|
|
|
|
/* Skip values we know can't be right: (a|n) = 0 (or 1 for odd primes) */ |
1314
|
813
|
100
|
|
|
|
|
if (phi == n-1) { if (kronecker_uu(a, n) != -1) continue; } |
|
|
100
|
|
|
|
|
|
1315
|
1
|
50
|
|
|
|
|
else { if (gcd_ui(a,n) != 1) continue; } |
1316
|
160
|
|
|
|
|
|
r = mont_geta(a, n); |
1317
|
436
|
100
|
|
|
|
|
for (i = 0; i < nfactors; i++) |
1318
|
422
|
100
|
|
|
|
|
if (mont_powmod(r, phi_div_fac[i], n) == mont1) |
1319
|
146
|
|
|
|
|
|
break; |
1320
|
160
|
100
|
|
|
|
|
if (i == nfactors) return a; |
1321
|
|
|
|
|
|
|
} |
1322
|
|
|
|
|
|
|
} else |
1323
|
|
|
|
|
|
|
#endif |
1324
|
36
|
50
|
|
|
|
|
for (a = 2; a < n; a++) { |
1325
|
36
|
100
|
|
|
|
|
if (a == 4 || a == 8 || a == 9) continue; /* Skip some perfect powers */ |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
1326
|
|
|
|
|
|
|
/* Skip values we know can't be right: (a|n) = 0 (or 1 for odd primes) */ |
1327
|
32
|
50
|
|
|
|
|
if (phi == n-1) { if (kronecker_uu(a, n) != -1) continue; } |
|
|
0
|
|
|
|
|
|
1328
|
32
|
100
|
|
|
|
|
else { if (gcd_ui(a,n) != 1) continue; } |
1329
|
23
|
100
|
|
|
|
|
for (i = 0; i < nfactors; i++) |
1330
|
20
|
100
|
|
|
|
|
if (powmod(a, phi_div_fac[i], n) == 1) |
1331
|
13
|
|
|
|
|
|
break; |
1332
|
16
|
100
|
|
|
|
|
if (i == nfactors) return a; |
1333
|
|
|
|
|
|
|
} |
1334
|
25
|
|
|
|
|
|
return 0; |
1335
|
|
|
|
|
|
|
} |
1336
|
|
|
|
|
|
|
|
1337
|
47
|
|
|
|
|
|
int is_primitive_root(UV a, UV n, int nprime) { |
1338
|
|
|
|
|
|
|
UV s, fac[MPU_MAX_FACTORS+1]; |
1339
|
|
|
|
|
|
|
int i, nfacs; |
1340
|
|
|
|
|
|
|
|
1341
|
47
|
100
|
|
|
|
|
if (n <= 1) return n; |
1342
|
45
|
100
|
|
|
|
|
if (a >= n) a %= n; |
1343
|
45
|
100
|
|
|
|
|
if (n <= 4) return a == n-1; |
1344
|
38
|
100
|
|
|
|
|
if (n % 4 == 0) return 0; |
1345
|
|
|
|
|
|
|
|
1346
|
|
|
|
|
|
|
/* Very simple, but not fast: |
1347
|
|
|
|
|
|
|
* s = nprime ? n-1 : totient(n); |
1348
|
|
|
|
|
|
|
* return s == znorder(a, n); |
1349
|
|
|
|
|
|
|
*/ |
1350
|
|
|
|
|
|
|
|
1351
|
37
|
100
|
|
|
|
|
if (gcd_ui(a,n) != 1) return 0; |
1352
|
36
|
100
|
|
|
|
|
if (nprime) { |
1353
|
15
|
|
|
|
|
|
s = n-1; |
1354
|
|
|
|
|
|
|
} else { |
1355
|
21
|
100
|
|
|
|
|
UV on = (n&1) ? n : (n>>1); |
1356
|
21
|
|
|
|
|
|
UV k = powerof(on); |
1357
|
21
|
|
|
|
|
|
UV r = rootof(on, k); |
1358
|
21
|
100
|
|
|
|
|
if (!is_prob_prime(r)) return 0; /* c^a or 2c^a */ |
1359
|
19
|
|
|
|
|
|
s = (r-1) * (on/r); /* p^a or 2p^a */ |
1360
|
|
|
|
|
|
|
} |
1361
|
34
|
100
|
|
|
|
|
if (s == n-1 && kronecker_uu(a,n) != -1) return 0; |
|
|
100
|
|
|
|
|
|
1362
|
|
|
|
|
|
|
|
1363
|
|
|
|
|
|
|
/* a^x can be a primitive root only if gcd(x,s) = 1 */ |
1364
|
26
|
|
|
|
|
|
i = is_power(a,0); |
1365
|
26
|
100
|
|
|
|
|
if (i > 1 && gcd_ui(i, s) != 1) return 0; |
|
|
50
|
|
|
|
|
|
1366
|
|
|
|
|
|
|
|
1367
|
|
|
|
|
|
|
#if USE_MONTMATH |
1368
|
26
|
100
|
|
|
|
|
if (n & 1) { |
1369
|
23
|
|
|
|
|
|
const uint64_t npi = mont_inverse(n), mont1 = mont_get1(n); |
1370
|
23
|
|
|
|
|
|
a = mont_geta(a, n); |
1371
|
|
|
|
|
|
|
/* Quick check for small factors before full factor */ |
1372
|
23
|
50
|
|
|
|
|
if ((s % 2) == 0 && mont_powmod(a, s/2, n) == mont1) return 0; |
|
|
50
|
|
|
|
|
|
1373
|
23
|
100
|
|
|
|
|
if ((s % 3) == 0 && mont_powmod(a, s/3, n) == mont1) return 0; |
|
|
100
|
|
|
|
|
|
1374
|
22
|
100
|
|
|
|
|
if ((s % 5) == 0 && mont_powmod(a, s/5, n) == mont1) return 0; |
|
|
50
|
|
|
|
|
|
1375
|
22
|
|
|
|
|
|
nfacs = factor_exp(s, fac, 0); |
1376
|
97
|
100
|
|
|
|
|
for (i = 0; i < nfacs; i++) |
1377
|
75
|
100
|
|
|
|
|
if (fac[i] > 5 && mont_powmod(a, s/fac[i], n) == mont1) |
|
|
50
|
|
|
|
|
|
1378
|
0
|
|
|
|
|
|
return 0; |
1379
|
|
|
|
|
|
|
} else |
1380
|
|
|
|
|
|
|
#endif |
1381
|
|
|
|
|
|
|
{ |
1382
|
|
|
|
|
|
|
/* Quick check for small factors before full factor */ |
1383
|
3
|
50
|
|
|
|
|
if ((s % 2) == 0 && powmod(a, s/2, n) == 1) return 0; |
|
|
50
|
|
|
|
|
|
1384
|
3
|
50
|
|
|
|
|
if ((s % 3) == 0 && powmod(a, s/3, n) == 1) return 0; |
|
|
0
|
|
|
|
|
|
1385
|
3
|
100
|
|
|
|
|
if ((s % 5) == 0 && powmod(a, s/5, n) == 1) return 0; |
|
|
50
|
|
|
|
|
|
1386
|
|
|
|
|
|
|
/* Complete factor and check each one not found above. */ |
1387
|
2
|
|
|
|
|
|
nfacs = factor_exp(s, fac, 0); |
1388
|
4
|
100
|
|
|
|
|
for (i = 0; i < nfacs; i++) |
1389
|
2
|
50
|
|
|
|
|
if (fac[i] > 5 && powmod(a, s/fac[i], n) == 1) |
|
|
0
|
|
|
|
|
|
1390
|
0
|
|
|
|
|
|
return 0; |
1391
|
|
|
|
|
|
|
} |
1392
|
47
|
|
|
|
|
|
return 1; |
1393
|
|
|
|
|
|
|
} |
1394
|
|
|
|
|
|
|
|
1395
|
50
|
|
|
|
|
|
IV gcdext(IV a, IV b, IV* u, IV* v, IV* cs, IV* ct) { |
1396
|
50
|
|
|
|
|
|
IV s = 0; IV os = 1; |
1397
|
50
|
|
|
|
|
|
IV t = 1; IV ot = 0; |
1398
|
50
|
|
|
|
|
|
IV r = b; IV or = a; |
1399
|
50
|
100
|
|
|
|
|
if (a == 0 && b == 0) { os = 0; t = 0; } |
|
|
100
|
|
|
|
|
|
1400
|
335
|
100
|
|
|
|
|
while (r != 0) { |
1401
|
285
|
|
|
|
|
|
IV quot = or / r; |
1402
|
285
|
|
|
|
|
|
{ IV tmp = r; r = or - quot * r; or = tmp; } |
1403
|
285
|
|
|
|
|
|
{ IV tmp = s; s = os - quot * s; os = tmp; } |
1404
|
285
|
|
|
|
|
|
{ IV tmp = t; t = ot - quot * t; ot = tmp; } |
1405
|
|
|
|
|
|
|
} |
1406
|
50
|
100
|
|
|
|
|
if (or < 0) /* correct sign */ |
1407
|
4
|
|
|
|
|
|
{ or = -or; os = -os; ot = -ot; } |
1408
|
50
|
50
|
|
|
|
|
if (u != 0) *u = os; |
1409
|
50
|
50
|
|
|
|
|
if (v != 0) *v = ot; |
1410
|
50
|
100
|
|
|
|
|
if (cs != 0) *cs = s; |
1411
|
50
|
100
|
|
|
|
|
if (ct != 0) *ct = t; |
1412
|
50
|
|
|
|
|
|
return or; |
1413
|
|
|
|
|
|
|
} |
1414
|
|
|
|
|
|
|
|
1415
|
|
|
|
|
|
|
/* Calculate 1/a mod n. */ |
1416
|
161
|
|
|
|
|
|
UV modinverse(UV a, UV n) { |
1417
|
161
|
|
|
|
|
|
IV t = 0; UV nt = 1; |
1418
|
161
|
|
|
|
|
|
UV r = n; UV nr = a; |
1419
|
3833
|
100
|
|
|
|
|
while (nr != 0) { |
1420
|
3672
|
|
|
|
|
|
UV quot = r / nr; |
1421
|
3672
|
|
|
|
|
|
{ UV tmp = nt; nt = t - quot*nt; t = tmp; } |
1422
|
3672
|
|
|
|
|
|
{ UV tmp = nr; nr = r - quot*nr; r = tmp; } |
1423
|
|
|
|
|
|
|
} |
1424
|
161
|
100
|
|
|
|
|
if (r > 1) return 0; /* No inverse */ |
1425
|
120
|
100
|
|
|
|
|
if (t < 0) t += n; |
1426
|
120
|
|
|
|
|
|
return t; |
1427
|
|
|
|
|
|
|
} |
1428
|
|
|
|
|
|
|
|
1429
|
2
|
|
|
|
|
|
UV divmod(UV a, UV b, UV n) { /* a / b mod n */ |
1430
|
2
|
|
|
|
|
|
UV binv = modinverse(b, n); |
1431
|
2
|
50
|
|
|
|
|
if (binv == 0) return 0; |
1432
|
2
|
|
|
|
|
|
return mulmod(a, binv, n); |
1433
|
|
|
|
|
|
|
} |
1434
|
|
|
|
|
|
|
|
1435
|
183072
|
|
|
|
|
|
static UV _powfactor(UV p, UV d, UV m) { |
1436
|
183072
|
|
|
|
|
|
UV e = 0; |
1437
|
366571
|
100
|
|
|
|
|
do { d /= p; e += d; } while (d > 0); |
1438
|
183072
|
|
|
|
|
|
return powmod(p, e, m); |
1439
|
|
|
|
|
|
|
} |
1440
|
|
|
|
|
|
|
|
1441
|
821
|
|
|
|
|
|
UV factorialmod(UV n, UV m) { /* n! mod m */ |
1442
|
821
|
|
|
|
|
|
UV i, d = n, res = 1; |
1443
|
|
|
|
|
|
|
|
1444
|
821
|
50
|
|
|
|
|
if (n >= m || m == 1) return 0; |
|
|
100
|
|
|
|
|
|
1445
|
|
|
|
|
|
|
|
1446
|
820
|
100
|
|
|
|
|
if (n <= 10) { /* Keep things simple for small n */ |
1447
|
1672
|
100
|
|
|
|
|
for (i = 2; i <= n && res != 0; i++) |
|
|
100
|
|
|
|
|
|
1448
|
1288
|
|
|
|
|
|
res = (res * i) % m; |
1449
|
384
|
|
|
|
|
|
return res; |
1450
|
|
|
|
|
|
|
} |
1451
|
|
|
|
|
|
|
|
1452
|
436
|
100
|
|
|
|
|
if (n > m/2 && is_prime(m)) /* Check if we can go backwards */ |
|
|
100
|
|
|
|
|
|
1453
|
74
|
|
|
|
|
|
d = m-n-1; |
1454
|
436
|
100
|
|
|
|
|
if (d < 2) |
1455
|
14
|
100
|
|
|
|
|
return (d == 0) ? m-1 : 1; /* Wilson's Theorem: n = m-1 and n = m-2 */ |
1456
|
|
|
|
|
|
|
|
1457
|
422
|
100
|
|
|
|
|
if (d == n && d > 5000000) { /* Check for composite m that leads to 0 */ |
|
|
100
|
|
|
|
|
|
1458
|
|
|
|
|
|
|
UV fac[MPU_MAX_FACTORS+1], exp[MPU_MAX_FACTORS+1]; |
1459
|
1
|
|
|
|
|
|
int j, k, nfacs = factor_exp(m, fac, exp); |
1460
|
2
|
100
|
|
|
|
|
for (j = 0; j < nfacs; j++) { |
1461
|
1
|
|
|
|
|
|
UV t = fac[j]; |
1462
|
3
|
100
|
|
|
|
|
for (k = 1; (UV)k < exp[j]; k++) |
1463
|
2
|
|
|
|
|
|
t *= fac[j]; |
1464
|
1
|
50
|
|
|
|
|
if (n >= t) return 0; |
1465
|
|
|
|
|
|
|
} |
1466
|
|
|
|
|
|
|
} |
1467
|
|
|
|
|
|
|
|
1468
|
|
|
|
|
|
|
#if USE_MONTMATH |
1469
|
618
|
100
|
|
|
|
|
if (m & 1 && d < 40000) { |
|
|
100
|
|
|
|
|
|
1470
|
196
|
|
|
|
|
|
const uint64_t npi = mont_inverse(m), mont1 = mont_get1(m); |
1471
|
196
|
|
|
|
|
|
uint64_t monti = mont1; |
1472
|
196
|
|
|
|
|
|
res = mont1; |
1473
|
1828
|
100
|
|
|
|
|
for (i = 2; i <= d && res != 0; i++) { |
|
|
100
|
|
|
|
|
|
1474
|
1632
|
|
|
|
|
|
monti = addmod(monti,mont1,m); |
1475
|
1632
|
50
|
|
|
|
|
res = mont_mulmod(res,monti,m); |
1476
|
|
|
|
|
|
|
} |
1477
|
196
|
50
|
|
|
|
|
res = mont_recover(res, m); |
1478
|
|
|
|
|
|
|
} else |
1479
|
|
|
|
|
|
|
#endif |
1480
|
226
|
100
|
|
|
|
|
if (d < 10000) { |
1481
|
2031
|
100
|
|
|
|
|
for (i = 2; i <= d && res != 0; i++) |
|
|
100
|
|
|
|
|
|
1482
|
1806
|
|
|
|
|
|
res = mulmod(res,i,m); |
1483
|
|
|
|
|
|
|
} else { |
1484
|
|
|
|
|
|
|
#if 0 /* Monolithic prime walk */ |
1485
|
|
|
|
|
|
|
START_DO_FOR_EACH_PRIME(2, d) { |
1486
|
|
|
|
|
|
|
UV k = (p > (d>>1)) ? p : _powfactor(p, d, m); |
1487
|
|
|
|
|
|
|
res = mulmod(res, k, m); |
1488
|
|
|
|
|
|
|
if (res == 0) break; |
1489
|
|
|
|
|
|
|
} END_DO_FOR_EACH_PRIME; |
1490
|
|
|
|
|
|
|
#else /* Segmented prime walk */ |
1491
|
|
|
|
|
|
|
unsigned char* segment; |
1492
|
|
|
|
|
|
|
UV seg_base, seg_low, seg_high; |
1493
|
1
|
|
|
|
|
|
void* ctx = start_segment_primes(7, d, &segment); |
1494
|
4
|
100
|
|
|
|
|
for (i = 1; i <= 3; i++) /* Handle 2,3,5 assume d>10*/ |
1495
|
3
|
|
|
|
|
|
res = mulmod(res, _powfactor(2*i - (i>1), d, m), m); |
1496
|
7
|
50
|
|
|
|
|
while (res != 0 && next_segment_primes(ctx, &seg_base, &seg_low, &seg_high)) { |
|
|
100
|
|
|
|
|
|
1497
|
369350
|
50
|
|
|
|
|
START_DO_FOR_EACH_SIEVE_PRIME( segment, seg_base, seg_low, seg_high ) |
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
1498
|
348510
|
100
|
|
|
|
|
UV k = (p > (d>>1)) ? p : _powfactor(p, d, m); |
1499
|
348510
|
|
|
|
|
|
res = mulmod(res, k, m); |
1500
|
348510
|
50
|
|
|
|
|
if (res == 0) break; |
1501
|
20834
|
|
|
|
|
|
END_DO_FOR_EACH_SIEVE_PRIME |
1502
|
|
|
|
|
|
|
} |
1503
|
1
|
|
|
|
|
|
end_segment_primes(ctx); |
1504
|
|
|
|
|
|
|
#endif |
1505
|
|
|
|
|
|
|
} |
1506
|
|
|
|
|
|
|
|
1507
|
422
|
100
|
|
|
|
|
if (d != n && res != 0) { /* Handle backwards case */ |
|
|
50
|
|
|
|
|
|
1508
|
60
|
100
|
|
|
|
|
if (!(d&1)) res = submod(m,res,m); |
1509
|
60
|
|
|
|
|
|
res = modinverse(res,m); |
1510
|
|
|
|
|
|
|
} |
1511
|
|
|
|
|
|
|
|
1512
|
422
|
|
|
|
|
|
return res; |
1513
|
|
|
|
|
|
|
} |
1514
|
|
|
|
|
|
|
|
1515
|
15
|
|
|
|
|
|
static int verify_sqrtmod(UV s, UV *rs, UV a, UV p) { |
1516
|
15
|
100
|
|
|
|
|
if (p-s < s) s = p-s; |
1517
|
15
|
50
|
|
|
|
|
if (mulmod(s, s, p) != a) return 0; |
1518
|
15
|
|
|
|
|
|
*rs = s; |
1519
|
15
|
|
|
|
|
|
return 1; |
1520
|
|
|
|
|
|
|
} |
1521
|
|
|
|
|
|
|
#if !USE_MONTMATH |
1522
|
|
|
|
|
|
|
UV _sqrtmod_prime(UV a, UV p) { |
1523
|
|
|
|
|
|
|
if ((p % 4) == 3) { |
1524
|
|
|
|
|
|
|
return powmod(a, (p+1)>>2, p); |
1525
|
|
|
|
|
|
|
} |
1526
|
|
|
|
|
|
|
if ((p % 8) == 5) { /* Atkin's algorithm. Faster than Legendre. */ |
1527
|
|
|
|
|
|
|
UV a2, alpha, beta, b; |
1528
|
|
|
|
|
|
|
a2 = addmod(a,a,p); |
1529
|
|
|
|
|
|
|
alpha = powmod(a2,(p-5)>>3,p); |
1530
|
|
|
|
|
|
|
beta = mulmod(a2,sqrmod(alpha,p),p); |
1531
|
|
|
|
|
|
|
b = mulmod(alpha, mulmod(a, (beta ? beta-1 : p-1), p), p); |
1532
|
|
|
|
|
|
|
return b; |
1533
|
|
|
|
|
|
|
} |
1534
|
|
|
|
|
|
|
if ((p % 16) == 9) { /* Müller's algorithm extending Atkin */ |
1535
|
|
|
|
|
|
|
UV a2, alpha, beta, b, d = 1; |
1536
|
|
|
|
|
|
|
a2 = addmod(a,a,p); |
1537
|
|
|
|
|
|
|
alpha = powmod(a2, (p-9)>>4, p); |
1538
|
|
|
|
|
|
|
beta = mulmod(a2, sqrmod(alpha,p), p); |
1539
|
|
|
|
|
|
|
if (sqrmod(beta,p) != p-1) { |
1540
|
|
|
|
|
|
|
do { d += 2; } while (kronecker_uu(d,p) != -1 && d < p); |
1541
|
|
|
|
|
|
|
alpha = mulmod(alpha, powmod(d,(p-9)>>3,p), p); |
1542
|
|
|
|
|
|
|
beta = mulmod(a2, mulmod(sqrmod(d,p),sqrmod(alpha,p),p), p); |
1543
|
|
|
|
|
|
|
} |
1544
|
|
|
|
|
|
|
b = mulmod(alpha, mulmod(a, mulmod(d,(beta ? beta-1 : p-1),p),p),p); |
1545
|
|
|
|
|
|
|
return b; |
1546
|
|
|
|
|
|
|
} |
1547
|
|
|
|
|
|
|
|
1548
|
|
|
|
|
|
|
/* Verify Euler condition for odd p */ |
1549
|
|
|
|
|
|
|
if ((p & 1) && powmod(a,(p-1)>>1,p) != 1) return 0; |
1550
|
|
|
|
|
|
|
|
1551
|
|
|
|
|
|
|
{ |
1552
|
|
|
|
|
|
|
UV x, q, e, t, z, r, m, b; |
1553
|
|
|
|
|
|
|
q = p-1; |
1554
|
|
|
|
|
|
|
e = valuation(q, 2); |
1555
|
|
|
|
|
|
|
q >>= e; |
1556
|
|
|
|
|
|
|
t = 3; |
1557
|
|
|
|
|
|
|
while (kronecker_uu(t, p) != -1) { |
1558
|
|
|
|
|
|
|
t += 2; |
1559
|
|
|
|
|
|
|
if (t == 201) { /* exit if p looks like a composite */ |
1560
|
|
|
|
|
|
|
if ((p % 2) == 0 || powmod(2, p-1, p) != 1 || powmod(3, p-1, p) != 1) |
1561
|
|
|
|
|
|
|
return 0; |
1562
|
|
|
|
|
|
|
} else if (t >= 20000) { /* should never happen */ |
1563
|
|
|
|
|
|
|
return 0; |
1564
|
|
|
|
|
|
|
} |
1565
|
|
|
|
|
|
|
} |
1566
|
|
|
|
|
|
|
z = powmod(t, q, p); |
1567
|
|
|
|
|
|
|
b = powmod(a, q, p); |
1568
|
|
|
|
|
|
|
r = e; |
1569
|
|
|
|
|
|
|
q = (q+1) >> 1; |
1570
|
|
|
|
|
|
|
x = powmod(a, q, p); |
1571
|
|
|
|
|
|
|
while (b != 1) { |
1572
|
|
|
|
|
|
|
t = b; |
1573
|
|
|
|
|
|
|
for (m = 0; m < r && t != 1; m++) |
1574
|
|
|
|
|
|
|
t = sqrmod(t, p); |
1575
|
|
|
|
|
|
|
if (m >= r) break; |
1576
|
|
|
|
|
|
|
t = powmod(z, UVCONST(1) << (r-m-1), p); |
1577
|
|
|
|
|
|
|
x = mulmod(x, t, p); |
1578
|
|
|
|
|
|
|
z = mulmod(t, t, p); |
1579
|
|
|
|
|
|
|
b = mulmod(b, z, p); |
1580
|
|
|
|
|
|
|
r = m; |
1581
|
|
|
|
|
|
|
} |
1582
|
|
|
|
|
|
|
return x; |
1583
|
|
|
|
|
|
|
} |
1584
|
|
|
|
|
|
|
return 0; |
1585
|
|
|
|
|
|
|
} |
1586
|
|
|
|
|
|
|
#else |
1587
|
8
|
|
|
|
|
|
UV _sqrtmod_prime(UV a, UV p) { |
1588
|
8
|
|
|
|
|
|
const uint64_t npi = mont_inverse(p), mont1 = mont_get1(p); |
1589
|
8
|
|
|
|
|
|
a = mont_geta(a,p); |
1590
|
|
|
|
|
|
|
|
1591
|
8
|
100
|
|
|
|
|
if ((p % 4) == 3) { |
1592
|
1
|
|
|
|
|
|
UV b = mont_powmod(a, (p+1)>>2, p); |
1593
|
1
|
50
|
|
|
|
|
return mont_recover(b, p); |
1594
|
|
|
|
|
|
|
} |
1595
|
|
|
|
|
|
|
|
1596
|
7
|
100
|
|
|
|
|
if ((p % 8) == 5) { /* Atkin's algorithm. Faster than Legendre. */ |
1597
|
|
|
|
|
|
|
UV a2, alpha, beta, b; |
1598
|
5
|
|
|
|
|
|
a2 = addmod(a,a,p); |
1599
|
5
|
|
|
|
|
|
alpha = mont_powmod(a2,(p-5)>>3,p); |
1600
|
5
|
50
|
|
|
|
|
beta = mont_mulmod(a2,mont_sqrmod(alpha,p),p); |
|
|
0
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
1601
|
5
|
|
|
|
|
|
beta = submod(beta, mont1, p); |
1602
|
5
|
50
|
|
|
|
|
b = mont_mulmod(alpha, mont_mulmod(a, beta, p), p); |
|
|
0
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
1603
|
5
|
50
|
|
|
|
|
return mont_recover(b, p); |
1604
|
|
|
|
|
|
|
} |
1605
|
2
|
100
|
|
|
|
|
if ((p % 16) == 9) { /* Müller's algorithm extending Atkin */ |
1606
|
1
|
|
|
|
|
|
UV a2, alpha, beta, b, d = 1; |
1607
|
1
|
|
|
|
|
|
a2 = addmod(a,a,p); |
1608
|
1
|
|
|
|
|
|
alpha = mont_powmod(a2, (p-9)>>4, p); |
1609
|
1
|
50
|
|
|
|
|
beta = mont_mulmod(a2, mont_sqrmod(alpha,p), p); |
|
|
0
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
1610
|
1
|
50
|
|
|
|
|
if (mont_sqrmod(beta,p) != submod(0,mont1,p)) { |
|
|
50
|
|
|
|
|
|
1611
|
5
|
100
|
|
|
|
|
do { d += 2; } while (kronecker_uu(d,p) != -1 && d < p); |
|
|
50
|
|
|
|
|
|
1612
|
1
|
|
|
|
|
|
d = mont_geta(d,p); |
1613
|
1
|
50
|
|
|
|
|
alpha = mont_mulmod(alpha, mont_powmod(d,(p-9)>>3,p), p); |
1614
|
1
|
50
|
|
|
|
|
beta = mont_mulmod(a2, mont_mulmod(mont_sqrmod(d,p),mont_sqrmod(alpha,p),p), p); |
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
1615
|
1
|
50
|
|
|
|
|
beta = mont_mulmod(submod(beta,mont1,p), d, p); |
1616
|
|
|
|
|
|
|
} else { |
1617
|
0
|
|
|
|
|
|
beta = submod(beta, mont1, p); |
1618
|
|
|
|
|
|
|
} |
1619
|
1
|
50
|
|
|
|
|
b = mont_mulmod(alpha, mont_mulmod(a, beta, p), p); |
|
|
0
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
1620
|
1
|
50
|
|
|
|
|
return mont_recover(b, p); |
1621
|
|
|
|
|
|
|
} |
1622
|
|
|
|
|
|
|
|
1623
|
|
|
|
|
|
|
/* Verify Euler condition for odd p */ |
1624
|
1
|
50
|
|
|
|
|
if ((p & 1) && mont_powmod(a,(p-1)>>1,p) != mont1) return 0; |
|
|
50
|
|
|
|
|
|
1625
|
|
|
|
|
|
|
|
1626
|
|
|
|
|
|
|
{ |
1627
|
|
|
|
|
|
|
UV x, q, e, t, z, r, m, b; |
1628
|
1
|
|
|
|
|
|
q = p-1; |
1629
|
1
|
|
|
|
|
|
e = valuation(q, 2); |
1630
|
1
|
|
|
|
|
|
q >>= e; |
1631
|
1
|
|
|
|
|
|
t = 3; |
1632
|
1
|
50
|
|
|
|
|
while (kronecker_uu(t, p) != -1) { |
1633
|
0
|
|
|
|
|
|
t += 2; |
1634
|
0
|
0
|
|
|
|
|
if (t == 201) { /* exit if p looks like a composite */ |
1635
|
0
|
0
|
|
|
|
|
if ((p % 2) == 0 || powmod(2, p-1, p) != 1 || powmod(3, p-1, p) != 1) |
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
1636
|
0
|
|
|
|
|
|
return 0; |
1637
|
0
|
0
|
|
|
|
|
} else if (t >= 20000) { /* should never happen */ |
1638
|
0
|
|
|
|
|
|
return 0; |
1639
|
|
|
|
|
|
|
} |
1640
|
|
|
|
|
|
|
} |
1641
|
1
|
|
|
|
|
|
t = mont_geta(t, p); |
1642
|
1
|
|
|
|
|
|
z = mont_powmod(t, q, p); |
1643
|
1
|
|
|
|
|
|
b = mont_powmod(a, q, p); |
1644
|
1
|
|
|
|
|
|
r = e; |
1645
|
1
|
|
|
|
|
|
q = (q+1) >> 1; |
1646
|
1
|
|
|
|
|
|
x = mont_powmod(a, q, p); |
1647
|
3
|
100
|
|
|
|
|
while (b != mont1) { |
1648
|
2
|
|
|
|
|
|
t = b; |
1649
|
5
|
50
|
|
|
|
|
for (m = 0; m < r && t != mont1; m++) |
|
|
100
|
|
|
|
|
|
1650
|
3
|
50
|
|
|
|
|
t = mont_sqrmod(t, p); |
1651
|
2
|
50
|
|
|
|
|
if (m >= r) break; |
1652
|
2
|
|
|
|
|
|
t = mont_powmod(z, UVCONST(1) << (r-m-1), p); |
1653
|
2
|
50
|
|
|
|
|
x = mont_mulmod(x, t, p); |
1654
|
2
|
50
|
|
|
|
|
z = mont_mulmod(t, t, p); |
1655
|
2
|
50
|
|
|
|
|
b = mont_mulmod(b, z, p); |
1656
|
2
|
|
|
|
|
|
r = m; |
1657
|
|
|
|
|
|
|
} |
1658
|
1
|
50
|
|
|
|
|
return mont_recover(x, p); |
1659
|
|
|
|
|
|
|
} |
1660
|
|
|
|
|
|
|
return 0; |
1661
|
|
|
|
|
|
|
} |
1662
|
|
|
|
|
|
|
#endif |
1663
|
|
|
|
|
|
|
|
1664
|
10
|
|
|
|
|
|
int sqrtmod(UV *s, UV a, UV p) { |
1665
|
10
|
50
|
|
|
|
|
if (p == 0) return 0; |
1666
|
10
|
100
|
|
|
|
|
if (a >= p) a %= p; |
1667
|
10
|
50
|
|
|
|
|
if (p <= 2 || a <= 1) return verify_sqrtmod(a, s,a,p); |
|
|
100
|
|
|
|
|
|
1668
|
|
|
|
|
|
|
|
1669
|
8
|
|
|
|
|
|
return verify_sqrtmod(_sqrtmod_prime(a,p), s,a,p); |
1670
|
|
|
|
|
|
|
} |
1671
|
|
|
|
|
|
|
|
1672
|
7
|
|
|
|
|
|
int sqrtmod_composite(UV *s, UV a, UV n) { |
1673
|
|
|
|
|
|
|
UV fac[MPU_MAX_FACTORS+1]; |
1674
|
|
|
|
|
|
|
UV exp[MPU_MAX_FACTORS+1]; |
1675
|
|
|
|
|
|
|
UV sqr[MPU_MAX_FACTORS+1]; |
1676
|
|
|
|
|
|
|
UV p, j, k, gcdan; |
1677
|
|
|
|
|
|
|
int i, nfactors; |
1678
|
|
|
|
|
|
|
|
1679
|
7
|
100
|
|
|
|
|
if (n == 0) return 0; |
1680
|
5
|
50
|
|
|
|
|
if (a >= n) a %= n; |
1681
|
5
|
100
|
|
|
|
|
if (n <= 2 || a <= 1) return verify_sqrtmod(a, s,a,n); |
|
|
50
|
|
|
|
|
|
1682
|
|
|
|
|
|
|
|
1683
|
|
|
|
|
|
|
/* Simple existence check. It's still possible no solution exists.*/ |
1684
|
3
|
50
|
|
|
|
|
if (kronecker_uu(a, ((n%4) == 2) ? n/2 : n) == -1) return 0; |
|
|
50
|
|
|
|
|
|
1685
|
|
|
|
|
|
|
|
1686
|
|
|
|
|
|
|
/* if 8|n 'a' must = 1 mod 8, else if 4|n 'a' must = 1 mod 4 */ |
1687
|
3
|
50
|
|
|
|
|
if ((n % 4) == 0) { |
1688
|
0
|
0
|
|
|
|
|
if ((n % 8) == 0) { |
1689
|
0
|
0
|
|
|
|
|
if ((a % 8) != 1) return 0; |
1690
|
|
|
|
|
|
|
} else { |
1691
|
0
|
0
|
|
|
|
|
if ((a % 4) != 1) return 0; |
1692
|
|
|
|
|
|
|
} |
1693
|
|
|
|
|
|
|
} |
1694
|
|
|
|
|
|
|
|
1695
|
|
|
|
|
|
|
/* More detailed existence check before factoring. Still possible. */ |
1696
|
3
|
|
|
|
|
|
gcdan = gcd_ui(a, n); |
1697
|
3
|
50
|
|
|
|
|
if (gcdan == 1) { |
1698
|
0
|
0
|
|
|
|
|
if ((n % 3) == 0 && kronecker_uu(a, 3) != 1) return 0; |
|
|
0
|
|
|
|
|
|
1699
|
0
|
0
|
|
|
|
|
if ((n % 5) == 0 && kronecker_uu(a, 5) != 1) return 0; |
|
|
0
|
|
|
|
|
|
1700
|
0
|
0
|
|
|
|
|
if ((n % 7) == 0 && kronecker_uu(a, 7) != 1) return 0; |
|
|
0
|
|
|
|
|
|
1701
|
|
|
|
|
|
|
} |
1702
|
|
|
|
|
|
|
|
1703
|
|
|
|
|
|
|
/* Factor n */ |
1704
|
3
|
|
|
|
|
|
nfactors = factor_exp(n, fac, exp); |
1705
|
|
|
|
|
|
|
|
1706
|
|
|
|
|
|
|
/* If gcd(a,n)==1, this answers comclusively if a solution exists. */ |
1707
|
3
|
50
|
|
|
|
|
if (gcdan == 1) { |
1708
|
0
|
0
|
|
|
|
|
for (i = 0; i < nfactors; i++) |
1709
|
0
|
0
|
|
|
|
|
if (fac[i] > 7 && kronecker_uu(a, fac[i]) != 1) return 0; |
|
|
0
|
|
|
|
|
|
1710
|
|
|
|
|
|
|
} |
1711
|
|
|
|
|
|
|
|
1712
|
11
|
100
|
|
|
|
|
for (i = 0; i < nfactors; i++) { |
1713
|
|
|
|
|
|
|
|
1714
|
|
|
|
|
|
|
/* Powers of 2 */ |
1715
|
8
|
100
|
|
|
|
|
if (fac[i] == 2) { |
1716
|
3
|
50
|
|
|
|
|
if (exp[i] == 1) { |
1717
|
3
|
|
|
|
|
|
sqr[i] = a & 1; |
1718
|
0
|
0
|
|
|
|
|
} else if (exp[i] == 2) { |
1719
|
0
|
|
|
|
|
|
sqr[i] = 1; /* and 3 */ |
1720
|
|
|
|
|
|
|
} else { |
1721
|
|
|
|
|
|
|
UV this_roots[256], next_roots[256]; |
1722
|
0
|
|
|
|
|
|
UV nthis = 0, nnext = 0; |
1723
|
0
|
|
|
|
|
|
this_roots[nthis++] = 1; |
1724
|
0
|
|
|
|
|
|
this_roots[nthis++] = 3; |
1725
|
0
|
0
|
|
|
|
|
for (j = 2; j < exp[i]; j++) { |
1726
|
0
|
|
|
|
|
|
p = UVCONST(1) << (j+1); |
1727
|
0
|
|
|
|
|
|
nnext = 0; |
1728
|
0
|
0
|
|
|
|
|
for (k = 0; k < nthis && nnext < 254; k++) { |
|
|
0
|
|
|
|
|
|
1729
|
0
|
|
|
|
|
|
UV r = this_roots[k]; |
1730
|
0
|
0
|
|
|
|
|
if (sqrmod(r,p) == (a % p)) |
1731
|
0
|
|
|
|
|
|
next_roots[nnext++] = r; |
1732
|
0
|
0
|
|
|
|
|
if (sqrmod(p-r,p) == (a % p)) |
1733
|
0
|
|
|
|
|
|
next_roots[nnext++] = p-r; |
1734
|
|
|
|
|
|
|
} |
1735
|
0
|
0
|
|
|
|
|
if (nnext == 0) return 0; |
1736
|
|
|
|
|
|
|
/* copy next exponent's found roots to this one */ |
1737
|
0
|
|
|
|
|
|
nthis = nnext; |
1738
|
0
|
0
|
|
|
|
|
for (k = 0; k < nnext; k++) |
1739
|
0
|
|
|
|
|
|
this_roots[k] = next_roots[k]; |
1740
|
|
|
|
|
|
|
} |
1741
|
0
|
|
|
|
|
|
sqr[i] = this_roots[0]; |
1742
|
|
|
|
|
|
|
} |
1743
|
3
|
|
|
|
|
|
continue; |
1744
|
|
|
|
|
|
|
} |
1745
|
|
|
|
|
|
|
|
1746
|
|
|
|
|
|
|
/* p is an odd prime */ |
1747
|
5
|
|
|
|
|
|
p = fac[i]; |
1748
|
5
|
50
|
|
|
|
|
if (!sqrtmod(&(sqr[i]), a, p)) |
1749
|
0
|
|
|
|
|
|
return 0; |
1750
|
|
|
|
|
|
|
|
1751
|
|
|
|
|
|
|
/* Lift solution of x^2 = a mod p to x^2 = a mod p^e */ |
1752
|
5
|
50
|
|
|
|
|
for (j = 1; j < exp[i]; j++) { |
1753
|
|
|
|
|
|
|
UV xk2, yk, expect, sol; |
1754
|
0
|
|
|
|
|
|
xk2 = addmod(sqr[i],sqr[i],p); |
1755
|
0
|
|
|
|
|
|
yk = modinverse(xk2, p); |
1756
|
0
|
|
|
|
|
|
expect = mulmod(xk2,yk,p); |
1757
|
0
|
|
|
|
|
|
p *= fac[i]; |
1758
|
0
|
|
|
|
|
|
sol = submod(sqr[i], mulmod(submod(sqrmod(sqr[i],p), a % p, p), yk, p), p); |
1759
|
0
|
0
|
|
|
|
|
if (expect != 1 || sqrmod(sol,p) != (a % p)) { |
|
|
0
|
|
|
|
|
|
1760
|
|
|
|
|
|
|
/* printf("a %lu failure to lift to %lu^%d\n", a, fac[i], j+1); */ |
1761
|
0
|
|
|
|
|
|
return 0; |
1762
|
|
|
|
|
|
|
} |
1763
|
0
|
|
|
|
|
|
sqr[i] = sol; |
1764
|
|
|
|
|
|
|
} |
1765
|
|
|
|
|
|
|
} |
1766
|
|
|
|
|
|
|
|
1767
|
|
|
|
|
|
|
/* raise fac[i] */ |
1768
|
11
|
100
|
|
|
|
|
for (i = 0; i < nfactors; i++) |
1769
|
8
|
|
|
|
|
|
fac[i] = ipow(fac[i], exp[i]); |
1770
|
|
|
|
|
|
|
|
1771
|
3
|
|
|
|
|
|
p = chinese(sqr, fac, nfactors, &i); |
1772
|
7
|
50
|
|
|
|
|
return (i == 1) ? verify_sqrtmod(p, s, a, n) : 0; |
1773
|
|
|
|
|
|
|
} |
1774
|
|
|
|
|
|
|
|
1775
|
|
|
|
|
|
|
/* works only for co-prime inputs and also slower than the algorithm below, |
1776
|
|
|
|
|
|
|
* but handles the case where IV_MAX < lcm <= UV_MAX. |
1777
|
|
|
|
|
|
|
*/ |
1778
|
4
|
|
|
|
|
|
static UV _simple_chinese(UV* a, UV* n, UV num, int* status) { |
1779
|
4
|
|
|
|
|
|
UV i, lcm = 1, res = 0; |
1780
|
4
|
|
|
|
|
|
*status = 0; |
1781
|
4
|
50
|
|
|
|
|
if (num == 0) return 0; |
1782
|
|
|
|
|
|
|
|
1783
|
8
|
50
|
|
|
|
|
for (i = 0; i < num; i++) { |
1784
|
8
|
|
|
|
|
|
UV ni = n[i]; |
1785
|
8
|
|
|
|
|
|
UV gcd = gcd_ui(lcm, ni); |
1786
|
8
|
100
|
|
|
|
|
if (gcd != 1) return 0; /* not coprime */ |
1787
|
5
|
|
|
|
|
|
ni /= gcd; |
1788
|
5
|
100
|
|
|
|
|
if (ni > (UV_MAX/lcm)) return 0; /* lcm overflow */ |
1789
|
4
|
|
|
|
|
|
lcm *= ni; |
1790
|
|
|
|
|
|
|
} |
1791
|
0
|
0
|
|
|
|
|
for (i = 0; i < num; i++) { |
1792
|
|
|
|
|
|
|
UV p, inverse, term; |
1793
|
0
|
|
|
|
|
|
p = lcm / n[i]; |
1794
|
0
|
|
|
|
|
|
inverse = modinverse(p, n[i]); |
1795
|
0
|
0
|
|
|
|
|
if (inverse == 0) return 0; /* n's coprime so should never happen */ |
1796
|
0
|
|
|
|
|
|
term = mulmod(p, mulmod(a[i], inverse, lcm), lcm); |
1797
|
0
|
|
|
|
|
|
res = addmod(res, term, lcm); |
1798
|
|
|
|
|
|
|
} |
1799
|
0
|
|
|
|
|
|
*status = 1; |
1800
|
0
|
|
|
|
|
|
return res; |
1801
|
|
|
|
|
|
|
} |
1802
|
|
|
|
|
|
|
|
1803
|
|
|
|
|
|
|
/* status: 1 ok, -1 no inverse, 0 overflow */ |
1804
|
30
|
|
|
|
|
|
UV chinese(UV* a, UV* n, UV num, int* status) { |
1805
|
|
|
|
|
|
|
static unsigned short sgaps[] = {7983,3548,1577,701,301,132,57,23,10,4,1,0}; |
1806
|
|
|
|
|
|
|
UV gcd, i, j, lcm, sum, gi, gap; |
1807
|
30
|
|
|
|
|
|
*status = 1; |
1808
|
30
|
100
|
|
|
|
|
if (num == 0) return 0; |
1809
|
|
|
|
|
|
|
|
1810
|
|
|
|
|
|
|
/* Sort modulii, largest first */ |
1811
|
348
|
100
|
|
|
|
|
for (gi = 0, gap = sgaps[gi]; gap >= 1; gap = sgaps[++gi]) { |
1812
|
361
|
100
|
|
|
|
|
for (i = gap; i < num; i++) { |
1813
|
42
|
|
|
|
|
|
UV tn = n[i], ta = a[i]; |
1814
|
84
|
100
|
|
|
|
|
for (j = i; j >= gap && n[j-gap] < tn; j -= gap) |
|
|
100
|
|
|
|
|
|
1815
|
42
|
|
|
|
|
|
{ n[j] = n[j-gap]; a[j] = a[j-gap]; } |
1816
|
42
|
|
|
|
|
|
n[j] = tn; a[j] = ta; |
1817
|
|
|
|
|
|
|
} |
1818
|
|
|
|
|
|
|
} |
1819
|
|
|
|
|
|
|
|
1820
|
29
|
100
|
|
|
|
|
if (n[0] > IV_MAX) return _simple_chinese(a,n,num,status); |
1821
|
28
|
|
|
|
|
|
lcm = n[0]; sum = a[0] % n[0]; |
1822
|
58
|
100
|
|
|
|
|
for (i = 1; i < num; i++) { |
1823
|
|
|
|
|
|
|
IV u, v, t, s; |
1824
|
|
|
|
|
|
|
UV vs, ut; |
1825
|
38
|
|
|
|
|
|
gcd = gcdext(lcm, n[i], &u, &v, &s, &t); |
1826
|
41
|
100
|
|
|
|
|
if (gcd != 1 && ((sum % gcd) != (a[i] % gcd))) { *status = -1; return 0; } |
|
|
100
|
|
|
|
|
|
1827
|
33
|
100
|
|
|
|
|
if (s < 0) s = -s; |
1828
|
33
|
100
|
|
|
|
|
if (t < 0) t = -t; |
1829
|
33
|
100
|
|
|
|
|
if (s > (IV)(IV_MAX/lcm)) return _simple_chinese(a,n,num,status); |
1830
|
30
|
|
|
|
|
|
lcm *= s; |
1831
|
30
|
100
|
|
|
|
|
if (u < 0) u += lcm; |
1832
|
30
|
100
|
|
|
|
|
if (v < 0) v += lcm; |
1833
|
30
|
|
|
|
|
|
vs = mulmod((UV)v, (UV)s, lcm); |
1834
|
30
|
|
|
|
|
|
ut = mulmod((UV)u, (UV)t, lcm); |
1835
|
30
|
|
|
|
|
|
sum = addmod( mulmod(vs, sum, lcm), mulmod(ut, a[i], lcm), lcm ); |
1836
|
|
|
|
|
|
|
} |
1837
|
20
|
|
|
|
|
|
return sum; |
1838
|
|
|
|
|
|
|
} |
1839
|
|
|
|
|
|
|
|
1840
|
9
|
|
|
|
|
|
NV chebyshev_psi(UV n) |
1841
|
|
|
|
|
|
|
{ |
1842
|
|
|
|
|
|
|
UV k; |
1843
|
9
|
|
|
|
|
|
KAHAN_INIT(sum); |
1844
|
|
|
|
|
|
|
|
1845
|
58
|
100
|
|
|
|
|
for (k = log2floor(n); k > 0; k--) { |
|
|
100
|
|
|
|
|
|
1846
|
49
|
|
|
|
|
|
KAHAN_SUM(sum, chebyshev_theta(rootof(n,k))); |
1847
|
|
|
|
|
|
|
} |
1848
|
9
|
|
|
|
|
|
return sum; |
1849
|
|
|
|
|
|
|
} |
1850
|
|
|
|
|
|
|
|
1851
|
|
|
|
|
|
|
#if BITS_PER_WORD == 64 |
1852
|
|
|
|
|
|
|
typedef struct { |
1853
|
|
|
|
|
|
|
UV n; |
1854
|
|
|
|
|
|
|
LNV theta; |
1855
|
|
|
|
|
|
|
} cheby_theta_t; |
1856
|
|
|
|
|
|
|
static const cheby_theta_t _cheby_theta[] = { /* >= quad math precision */ |
1857
|
|
|
|
|
|
|
{ UVCONST( 67108864),LNVCONST( 67100507.6357700963903836828562472350035880) }, |
1858
|
|
|
|
|
|
|
{ UVCONST( 100000000),LNVCONST( 99987730.0180220043832124342600487053812729) }, |
1859
|
|
|
|
|
|
|
{ UVCONST( 134217728),LNVCONST( 134204014.5735572091791081610859055728165544) }, |
1860
|
|
|
|
|
|
|
{ UVCONST( 268435456),LNVCONST( 268419741.6134308193112682817754501071404173) }, |
1861
|
|
|
|
|
|
|
{ UVCONST( 536870912),LNVCONST( 536842885.8045763840625719515011160692495056) }, |
1862
|
|
|
|
|
|
|
{ UVCONST( 1000000000),LNVCONST( 999968978.5775661447991262386023331863364793) }, |
1863
|
|
|
|
|
|
|
{ UVCONST( 1073741824),LNVCONST( 1073716064.8860663337617909073555831842945484) }, |
1864
|
|
|
|
|
|
|
{ UVCONST( 2147483648),LNVCONST( 2147432200.2475857676814950053003448716360822) }, |
1865
|
|
|
|
|
|
|
{ UVCONST( 4294967296),LNVCONST( 4294889489.1735446386752045191908417183337361) }, |
1866
|
|
|
|
|
|
|
{ UVCONST( 8589934592),LNVCONST( 8589863179.5654263491545135406516173629373070) }, |
1867
|
|
|
|
|
|
|
{ UVCONST( 10000000000),LNVCONST( 9999939830.6577573841592219954033850595228736) }, |
1868
|
|
|
|
|
|
|
{ UVCONST( 12884901888),LNVCONST( 12884796620.4324254952601520445848183460347362) }, |
1869
|
|
|
|
|
|
|
{ UVCONST( 17179869184),LNVCONST( 17179757715.9924077567777285147574707468995695) }, |
1870
|
|
|
|
|
|
|
{ UVCONST( 21474836480),LNVCONST( 21474693322.0998273969188369449626287713082943) }, |
1871
|
|
|
|
|
|
|
{ UVCONST( 25769803776),LNVCONST( 25769579799.3751535467593954636665656772211515) }, |
1872
|
|
|
|
|
|
|
{ UVCONST( 30064771072),LNVCONST( 30064545001.2305211029215168703433831598544454) }, |
1873
|
|
|
|
|
|
|
{ UVCONST( 34359738368),LNVCONST( 34359499180.0126643918259085362039638823175054) }, |
1874
|
|
|
|
|
|
|
{ UVCONST( 51539607552),LNVCONST( 51539356394.9531019037592855639826469993402730) }, |
1875
|
|
|
|
|
|
|
{ UVCONST( 68719476736),LNVCONST( 68719165213.6369838785284711480925219076501720) }, |
1876
|
|
|
|
|
|
|
{ UVCONST( 85899345920),LNVCONST( 85899083852.3471545629838432726841470626910905) }, |
1877
|
|
|
|
|
|
|
{ UVCONST( 100000000000),LNVCONST( 99999737653.1074446948519125729820679772770146) }, |
1878
|
|
|
|
|
|
|
{ UVCONST( 103079215104),LNVCONST(103079022007.113299711630969211422868856259124) }, |
1879
|
|
|
|
|
|
|
{ UVCONST( 120259084288),LNVCONST(120258614516.787336970535750737470005730125261) }, |
1880
|
|
|
|
|
|
|
{ UVCONST( 137438953472),LNVCONST(137438579206.444595884982301543904849253294539) }, |
1881
|
|
|
|
|
|
|
{ UVCONST( 171798691840),LNVCONST(171798276885.585945657918751085729734540334501) }, |
1882
|
|
|
|
|
|
|
{ UVCONST( 206158430208),LNVCONST(206158003808.160276853604927822609009916573462) }, |
1883
|
|
|
|
|
|
|
{ UVCONST( 240518168576),LNVCONST(240517893445.995868018331936763125264759516048) }, |
1884
|
|
|
|
|
|
|
{ UVCONST( 274877906944),LNVCONST(274877354651.045354829956619821889825596300686) }, |
1885
|
|
|
|
|
|
|
{ UVCONST( 309237645312),LNVCONST(309237050379.850690561796126460858271984023198) }, |
1886
|
|
|
|
|
|
|
{ UVCONST( 343597383680),LNVCONST(343596855806.595496630500062749631211394707114) }, |
1887
|
|
|
|
|
|
|
{ UVCONST( 377957122048),LNVCONST(377956498560.227794386327526022452943941537993) }, |
1888
|
|
|
|
|
|
|
{ UVCONST( 412316860416),LNVCONST(412316008796.349553568121442261222464590518293) }, |
1889
|
|
|
|
|
|
|
{ UVCONST( 446676598784),LNVCONST(446675972485.936512329625489223180824947531484) }, |
1890
|
|
|
|
|
|
|
{ UVCONST( 481036337152),LNVCONST(481035608287.572961376833237046440177624505864) }, |
1891
|
|
|
|
|
|
|
{ UVCONST( 515396075520),LNVCONST(515395302740.633513931333424447688399032397200) }, |
1892
|
|
|
|
|
|
|
{ UVCONST( 549755813888),LNVCONST(549755185085.539613556787409928561107952681488) }, |
1893
|
|
|
|
|
|
|
{ UVCONST( 584115552256),LNVCONST(584115015741.698143680148976236958207248900725) }, |
1894
|
|
|
|
|
|
|
{ UVCONST( 618475290624),LNVCONST(618474400071.621528348965919774195984612254220) }, |
1895
|
|
|
|
|
|
|
{ UVCONST( 652835028992),LNVCONST(652834230470.583317059774197550110194348469358) }, |
1896
|
|
|
|
|
|
|
{ UVCONST( 687194767360),LNVCONST(687193697328.927006867624832386534836384752774) }, |
1897
|
|
|
|
|
|
|
{ UVCONST( 721554505728),LNVCONST(721553211683.605313067593521060195071837766347) }, |
1898
|
|
|
|
|
|
|
{ UVCONST( 755914244096),LNVCONST(755913502349.878525212441903698096011352015192) }, |
1899
|
|
|
|
|
|
|
{ UVCONST( 790273982464),LNVCONST(790273042590.053075430445971969285969445183076) }, |
1900
|
|
|
|
|
|
|
{ UVCONST( 824633720832),LNVCONST(824633080997.428352876758261549475609957696369) }, |
1901
|
|
|
|
|
|
|
{ UVCONST( 858993459200),LNVCONST(858992716288.318498931165663742671579465316192) }, |
1902
|
|
|
|
|
|
|
{ UVCONST( 893353197568),LNVCONST(893352235882.851072417721659027263613727927680) }, |
1903
|
|
|
|
|
|
|
{ UVCONST( 927712935936),LNVCONST(927711881043.628817668337317445143018372892386) }, |
1904
|
|
|
|
|
|
|
{ UVCONST( 962072674304),LNVCONST(962071726126.508938539006575212272731584070786) }, |
1905
|
|
|
|
|
|
|
{ UVCONST( 996432412672),LNVCONST(996431411588.361462717402562171913706963939018) }, |
1906
|
|
|
|
|
|
|
{ UVCONST( 1099511627776),LNVCONST(1099510565082.05800550569923209414874779035972) }, |
1907
|
|
|
|
|
|
|
{ UVCONST( 1168231104512),LNVCONST(1168230478726.83399452743801182220790107593115) }, |
1908
|
|
|
|
|
|
|
{ UVCONST( 1236950581248),LNVCONST(1236949680081.02610603189530371762093291521116) }, |
1909
|
|
|
|
|
|
|
{ UVCONST( 1305670057984),LNVCONST(1305668780900.04255251887970870257110498423202) }, |
1910
|
|
|
|
|
|
|
{ UVCONST( 1374389534720),LNVCONST(1374388383792.63751003694755359184583212193880) }, |
1911
|
|
|
|
|
|
|
{ UVCONST( 1443109011456),LNVCONST(1443107961091.80955496949174183091839841371227) }, |
1912
|
|
|
|
|
|
|
{ UVCONST( 1511828488192),LNVCONST(1511827317611.91227277802426032456922797572429) }, |
1913
|
|
|
|
|
|
|
{ UVCONST( 1580547964928),LNVCONST(1580546753969.30607547506449941085747942395437) }, |
1914
|
|
|
|
|
|
|
{ UVCONST( 1649267441664),LNVCONST(1649265973878.75361554498682516738256005501353) }, |
1915
|
|
|
|
|
|
|
{ UVCONST( 1717986918400),LNVCONST(1717985403764.24562741452793071287954107946922) }, |
1916
|
|
|
|
|
|
|
{ UVCONST( 1786706395136),LNVCONST(1786704769212.04241689416220650800274263053933) }, |
1917
|
|
|
|
|
|
|
{ UVCONST( 1855425871872),LNVCONST(1855425013030.54920163513184322741954734357404) }, |
1918
|
|
|
|
|
|
|
{ UVCONST( 1924145348608),LNVCONST(1924143701943.02957992419280264060220278182021) }, |
1919
|
|
|
|
|
|
|
{ UVCONST( 1992864825344),LNVCONST(1992863373568.84039296068619447120308124302086) }, |
1920
|
|
|
|
|
|
|
{ UVCONST( 2061584302080),LNVCONST(2061583632335.91985095534685076604018573279204) }, |
1921
|
|
|
|
|
|
|
{ UVCONST( 2130303778816),LNVCONST(2113122935598.01727180199783433992649406589029) }, |
1922
|
|
|
|
|
|
|
{ UVCONST( 2199023255552),LNVCONST(2199021399611.18488312543276191461914978761981) }, |
1923
|
|
|
|
|
|
|
{ UVCONST( 2267742732288),LNVCONST(2267740947106.05038218811506263712808318234921) }, |
1924
|
|
|
|
|
|
|
{ UVCONST( 2336462209024),LNVCONST(2336460081480.34962633829077377680844065198307) }, |
1925
|
|
|
|
|
|
|
{ UVCONST( 2405181685760),LNVCONST(2405179969505.38642629423585641169740223940265) }, |
1926
|
|
|
|
|
|
|
{ UVCONST( 2473901162496),LNVCONST(2473899311193.37872375168104562948639924654178) }, |
1927
|
|
|
|
|
|
|
{ UVCONST( 2542620639232),LNVCONST(2542619362554.88893589220737167756411653816418) }, |
1928
|
|
|
|
|
|
|
{ UVCONST( 2611340115968),LNVCONST(2611338370515.94936514022501267847930999670553) }, |
1929
|
|
|
|
|
|
|
{ UVCONST( 2680059592704),LNVCONST(2680057722824.52981820001574883706268873541107) }, |
1930
|
|
|
|
|
|
|
{ UVCONST( 2748779069440),LNVCONST(2748777610452.18903407570165081726781627254885) }, |
1931
|
|
|
|
|
|
|
{ UVCONST( 2817498546176),LNVCONST(2817497017165.31924616507392971415494161401775) }, |
1932
|
|
|
|
|
|
|
{ UVCONST( 2886218022912),LNVCONST(2886216579432.32232322707222172612181994322081) }, |
1933
|
|
|
|
|
|
|
{ UVCONST( 2954937499648),LNVCONST(2954936100812.97301730406598982753121204977388) }, |
1934
|
|
|
|
|
|
|
{ UVCONST( 3023656976384),LNVCONST(3023654789503.82041452274471455184651411931920) }, |
1935
|
|
|
|
|
|
|
{ UVCONST( 3298534883328),LNVCONST(3298533215621.76606493931157388037915263658637) }, |
1936
|
|
|
|
|
|
|
{ UVCONST( 3573412790272),LNVCONST(3573411344351.74163523704886736624674718378131) }, |
1937
|
|
|
|
|
|
|
{ UVCONST( 3848290697216),LNVCONST(3848288415701.82534219216958446478503907262807) }, |
1938
|
|
|
|
|
|
|
{ UVCONST( 4123168604160),LNVCONST(4123166102085.86116301709394219323327831487542) }, |
1939
|
|
|
|
|
|
|
{ UVCONST( 4398046511104),LNVCONST(4398044965678.05143041707871320554940671182665) }, |
1940
|
|
|
|
|
|
|
{ UVCONST( 4672924418048),LNVCONST(4672922414672.04998927945349278916525727295687) }, |
1941
|
|
|
|
|
|
|
{ UVCONST( 4947802324992),LNVCONST(4947800056419.04384937181159608905993450182729) }, |
1942
|
|
|
|
|
|
|
{ UVCONST( 5222680231936),LNVCONST(5222678728087.69487334278665824384732845008859) }, |
1943
|
|
|
|
|
|
|
{ UVCONST( 5497558138880),LNVCONST(5497555766573.55159115560501595606332808978878) }, |
1944
|
|
|
|
|
|
|
{ UVCONST( 5772436045824),LNVCONST(5772433560746.27053256770924553245647027548204) }, |
1945
|
|
|
|
|
|
|
{ UVCONST( 6047313952768),LNVCONST(6047310750621.24497633828761530843255989494448) }, |
1946
|
|
|
|
|
|
|
{ UVCONST( 6322191859712),LNVCONST(6322189275338.39747421237532473168802646234745) }, |
1947
|
|
|
|
|
|
|
{ UVCONST( 6597069766656),LNVCONST(6579887620000.56226807898107616294821989189226) }, |
1948
|
|
|
|
|
|
|
{ UVCONST( 6871947673600),LNVCONST(6871945430474.61791600096091374271286154432006) }, |
1949
|
|
|
|
|
|
|
{ UVCONST( 7146825580544),LNVCONST(7146823258390.34361980709600216319269118247416) }, |
1950
|
|
|
|
|
|
|
{ UVCONST( 7421703487488),LNVCONST(7421700443390.35536080251964387835425662360121) }, |
1951
|
|
|
|
|
|
|
{ UVCONST( 7696581394432),LNVCONST(7696578975137.73249441643024336954233783264803) }, |
1952
|
|
|
|
|
|
|
{ UVCONST( 7971459301376),LNVCONST(7971457197928.90863708984184849978605273042512) }, |
1953
|
|
|
|
|
|
|
{ UVCONST( 8246337208320),LNVCONST(8246333982863.77146812177727648999195989358960) }, |
1954
|
|
|
|
|
|
|
{ UVCONST( 8521215115264),LNVCONST(8529802085075.55635100929751669785228592926043) }, |
1955
|
|
|
|
|
|
|
{ UVCONST( 8796093022208),LNVCONST(8796089836425.34909684634625258535266362465034) }, |
1956
|
|
|
|
|
|
|
{ UVCONST( 9345848836096),LNVCONST(9345845828116.77456046925508587313) }, |
1957
|
|
|
|
|
|
|
{ UVCONST( 9895604649984),LNVCONST(9895601077915.26821447819584407150) }, |
1958
|
|
|
|
|
|
|
{ UVCONST(10000000000000),LNVCONST(9999996988293.03419965318214160284) }, |
1959
|
|
|
|
|
|
|
{ UVCONST(15000000000000),LNVCONST(14999996482301.7098815115045166858) }, |
1960
|
|
|
|
|
|
|
{ UVCONST(20000000000000),LNVCONST(19999995126082.2286880312461318496) }, |
1961
|
|
|
|
|
|
|
{ UVCONST(25000000000000),LNVCONST(24999994219058.4086216020475916538) }, |
1962
|
|
|
|
|
|
|
{ UVCONST(30000000000000),LNVCONST(29999995531389.8454274046657200568) }, |
1963
|
|
|
|
|
|
|
{ UVCONST(35000000000000),LNVCONST(34999992921190.8049427456456479005) }, |
1964
|
|
|
|
|
|
|
{ UVCONST(40000000000000),LNVCONST(39999993533724.3168289589273168844) }, |
1965
|
|
|
|
|
|
|
{ UVCONST(45000000000000),LNVCONST(44999993567606.9795798378256194424) }, |
1966
|
|
|
|
|
|
|
{ UVCONST(50000000000000),LNVCONST(49999992543194.2636545758235373677) }, |
1967
|
|
|
|
|
|
|
{ UVCONST(55000000000000),LNVCONST(54999990847877.2435105757522625171) }, |
1968
|
|
|
|
|
|
|
{ UVCONST(60000000000000),LNVCONST(59999990297033.6261976055811111726) }, |
1969
|
|
|
|
|
|
|
{ UVCONST(65000000000000),LNVCONST(64999990861395.5522142429859245014) }, |
1970
|
|
|
|
|
|
|
{ UVCONST(70000000000000),LNVCONST(69999994316409.8717306521862685981) }, |
1971
|
|
|
|
|
|
|
{ UVCONST(75000000000000),LNVCONST(74999990126219.8344899338374090165) }, |
1972
|
|
|
|
|
|
|
{ UVCONST(80000000000000),LNVCONST(79999990160858.3042387288372250950) }, |
1973
|
|
|
|
|
|
|
{ UVCONST(85000000000000),LNVCONST(84999987096970.5915212896832780715) }, |
1974
|
|
|
|
|
|
|
{ UVCONST(90000000000000),LNVCONST(89999989501395.0738966599857919767) }, |
1975
|
|
|
|
|
|
|
{ UVCONST(95000000000000),LNVCONST(94999990785908.6672552042792168144) }, |
1976
|
|
|
|
|
|
|
{ UVCONST(100000000000000),LNVCONST(99999990573246.9785384070303475639) }, |
1977
|
|
|
|
|
|
|
}; |
1978
|
|
|
|
|
|
|
#define NCHEBY_VALS (sizeof(_cheby_theta)/sizeof(_cheby_theta[0])) |
1979
|
|
|
|
|
|
|
#endif |
1980
|
|
|
|
|
|
|
|
1981
|
58
|
|
|
|
|
|
NV chebyshev_theta(UV n) |
1982
|
|
|
|
|
|
|
{ |
1983
|
58
|
|
|
|
|
|
uint16_t i = 0; |
1984
|
|
|
|
|
|
|
UV tp, startn, seg_base, seg_low, seg_high; |
1985
|
|
|
|
|
|
|
unsigned char* segment; |
1986
|
|
|
|
|
|
|
void* ctx; |
1987
|
58
|
|
|
|
|
|
LNV initial_sum, prod = LNV_ONE; |
1988
|
58
|
|
|
|
|
|
KAHAN_INIT(sum); |
1989
|
|
|
|
|
|
|
|
1990
|
58
|
100
|
|
|
|
|
if (n < 500) { |
1991
|
379
|
100
|
|
|
|
|
for (i = 1; (tp = primes_tiny[i]) <= n; i++) { |
1992
|
326
|
|
|
|
|
|
KAHAN_SUM(sum, loglnv(tp)); |
1993
|
|
|
|
|
|
|
} |
1994
|
53
|
|
|
|
|
|
return sum; |
1995
|
|
|
|
|
|
|
} |
1996
|
|
|
|
|
|
|
|
1997
|
|
|
|
|
|
|
#if defined NCHEBY_VALS |
1998
|
5
|
50
|
|
|
|
|
if (n >= _cheby_theta[0].n) { |
1999
|
0
|
0
|
|
|
|
|
for (i = 1; i < NCHEBY_VALS; i++) |
2000
|
0
|
0
|
|
|
|
|
if (n < _cheby_theta[i].n) |
2001
|
0
|
|
|
|
|
|
break; |
2002
|
0
|
|
|
|
|
|
startn = _cheby_theta[i-1].n; |
2003
|
0
|
|
|
|
|
|
initial_sum = _cheby_theta[i-1].theta; |
2004
|
|
|
|
|
|
|
} else |
2005
|
|
|
|
|
|
|
#endif |
2006
|
|
|
|
|
|
|
{ |
2007
|
5
|
|
|
|
|
|
KAHAN_SUM(sum, loglnv(2*3*5*7*11*13)); |
2008
|
5
|
|
|
|
|
|
startn = 17; |
2009
|
5
|
|
|
|
|
|
initial_sum = 0; |
2010
|
|
|
|
|
|
|
} |
2011
|
|
|
|
|
|
|
|
2012
|
5
|
|
|
|
|
|
ctx = start_segment_primes(startn, n, &segment); |
2013
|
|
|
|
|
|
|
#if 0 |
2014
|
|
|
|
|
|
|
while (next_segment_primes(ctx, &seg_base, &seg_low, &seg_high)) { |
2015
|
|
|
|
|
|
|
START_DO_FOR_EACH_SIEVE_PRIME( segment, seg_base, seg_low, seg_high ) { |
2016
|
|
|
|
|
|
|
KAHAN_SUM(sum, loglnv(p)); |
2017
|
|
|
|
|
|
|
} END_DO_FOR_EACH_SIEVE_PRIME |
2018
|
|
|
|
|
|
|
} |
2019
|
|
|
|
|
|
|
#else |
2020
|
12
|
100
|
|
|
|
|
while (next_segment_primes(ctx, &seg_base, &seg_low, &seg_high)) { |
2021
|
225425
|
50
|
|
|
|
|
START_DO_FOR_EACH_SIEVE_PRIME( segment, seg_base, seg_low, seg_high ) { |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
2022
|
214078
|
|
|
|
|
|
prod *= (LNV) p; |
2023
|
214078
|
100
|
|
|
|
|
if (++i >= (LNV_IS_QUAD ? 64 : 8)) { |
2024
|
26758
|
|
|
|
|
|
KAHAN_SUM(sum, loglnv(prod)); |
2025
|
26758
|
|
|
|
|
|
prod = LNV_ONE; |
2026
|
26758
|
|
|
|
|
|
i = 0; |
2027
|
|
|
|
|
|
|
} |
2028
|
11325
|
|
|
|
|
|
} END_DO_FOR_EACH_SIEVE_PRIME |
2029
|
|
|
|
|
|
|
} |
2030
|
5
|
50
|
|
|
|
|
if (prod > 1.0) { KAHAN_SUM(sum, loglnv(prod)); prod = LNV_ONE; } |
2031
|
|
|
|
|
|
|
#endif |
2032
|
5
|
|
|
|
|
|
end_segment_primes(ctx); |
2033
|
|
|
|
|
|
|
|
2034
|
5
|
50
|
|
|
|
|
if (initial_sum > 0) KAHAN_SUM(sum, initial_sum); |
2035
|
58
|
|
|
|
|
|
return sum; |
2036
|
|
|
|
|
|
|
} |
2037
|
|
|
|
|
|
|
|
2038
|
|
|
|
|
|
|
|
2039
|
|
|
|
|
|
|
|
2040
|
|
|
|
|
|
|
/* |
2041
|
|
|
|
|
|
|
* See: |
2042
|
|
|
|
|
|
|
* "Multiple-Precision Exponential Integral and Related Functions" |
2043
|
|
|
|
|
|
|
* by David M. Smith |
2044
|
|
|
|
|
|
|
* "On the Evaluation of the Complex-Valued Exponential Integral" |
2045
|
|
|
|
|
|
|
* by Vincent Pegoraro and Philipp Slusallek |
2046
|
|
|
|
|
|
|
* "Numerical Recipes" 3rd edition |
2047
|
|
|
|
|
|
|
* by William H. Press et al. |
2048
|
|
|
|
|
|
|
* "Rational Chevyshev Approximations for the Exponential Integral E_1(x)" |
2049
|
|
|
|
|
|
|
* by W. J. Cody and Henry C. Thacher, Jr. |
2050
|
|
|
|
|
|
|
* |
2051
|
|
|
|
|
|
|
* Any mistakes here are completely my fault. This code has not been |
2052
|
|
|
|
|
|
|
* verified for anything serious. For better results, see: |
2053
|
|
|
|
|
|
|
* http://www.trnicely.net/pi/pix_0000.htm |
2054
|
|
|
|
|
|
|
* which although the author claims are demonstration programs, will |
2055
|
|
|
|
|
|
|
* undoubtedly produce more reliable results than this code does (I don't |
2056
|
|
|
|
|
|
|
* know of any obvious issues with this code, but it just hasn't been used |
2057
|
|
|
|
|
|
|
* by many people). |
2058
|
|
|
|
|
|
|
*/ |
2059
|
|
|
|
|
|
|
|
2060
|
|
|
|
|
|
|
static LNV const euler_mascheroni = LNVCONST(0.57721566490153286060651209008240243104215933593992); |
2061
|
|
|
|
|
|
|
static LNV const li2 = LNVCONST(1.045163780117492784844588889194613136522615578151); |
2062
|
|
|
|
|
|
|
|
2063
|
234
|
|
|
|
|
|
NV Ei(NV x) { |
2064
|
|
|
|
|
|
|
LNV val, term; |
2065
|
|
|
|
|
|
|
unsigned int n; |
2066
|
234
|
|
|
|
|
|
KAHAN_INIT(sum); |
2067
|
|
|
|
|
|
|
|
2068
|
234
|
50
|
|
|
|
|
if (x == 0) croak("Invalid input to ExponentialIntegral: x must be != 0"); |
2069
|
|
|
|
|
|
|
/* Protect against messed up rounding modes */ |
2070
|
234
|
50
|
|
|
|
|
if (x >= 12000) return INFINITY; |
2071
|
234
|
50
|
|
|
|
|
if (x <= -12000) return 0; |
2072
|
|
|
|
|
|
|
|
2073
|
234
|
100
|
|
|
|
|
if (x < -1) { |
2074
|
|
|
|
|
|
|
/* Continued fraction, good for x < -1 */ |
2075
|
1
|
|
|
|
|
|
LNV lc = 0; |
2076
|
1
|
|
|
|
|
|
LNV ld = LNV_ONE / (LNV_ONE - (LNV)x); |
2077
|
1
|
|
|
|
|
|
val = ld * (-explnv(x)); |
2078
|
21
|
50
|
|
|
|
|
for (n = 1; n <= 100000; n++) { |
2079
|
|
|
|
|
|
|
LNV old, t, n2; |
2080
|
20
|
|
|
|
|
|
t = (LNV)(2*n + 1) - (LNV) x; |
2081
|
20
|
|
|
|
|
|
n2 = n * n; |
2082
|
20
|
|
|
|
|
|
lc = LNV_ONE / (t - n2 * lc); |
2083
|
20
|
|
|
|
|
|
ld = LNV_ONE / (t - n2 * ld); |
2084
|
20
|
|
|
|
|
|
old = val; |
2085
|
20
|
|
|
|
|
|
val *= ld/lc; |
2086
|
20
|
100
|
|
|
|
|
if ( fabslnv(val-old) <= LNV_EPSILON*fabslnv(val) ) |
2087
|
1
|
|
|
|
|
|
break; |
2088
|
|
|
|
|
|
|
} |
2089
|
233
|
100
|
|
|
|
|
} else if (x < 0) { |
2090
|
|
|
|
|
|
|
/* Rational Chebyshev approximation (Cody, Thacher), good for -1 < x < 0 */ |
2091
|
|
|
|
|
|
|
static const LNV C6p[7] = { LNVCONST(-148151.02102575750838086), |
2092
|
|
|
|
|
|
|
LNVCONST( 150260.59476436982420737), |
2093
|
|
|
|
|
|
|
LNVCONST( 89904.972007457256553251), |
2094
|
|
|
|
|
|
|
LNVCONST( 15924.175980637303639884), |
2095
|
|
|
|
|
|
|
LNVCONST( 2150.0672908092918123209), |
2096
|
|
|
|
|
|
|
LNVCONST( 116.69552669734461083368), |
2097
|
|
|
|
|
|
|
LNVCONST( 5.0196785185439843791020) }; |
2098
|
|
|
|
|
|
|
static const LNV C6q[7] = { LNVCONST( 256664.93484897117319268), |
2099
|
|
|
|
|
|
|
LNVCONST( 184340.70063353677359298), |
2100
|
|
|
|
|
|
|
LNVCONST( 52440.529172056355429883), |
2101
|
|
|
|
|
|
|
LNVCONST( 8125.8035174768735759866), |
2102
|
|
|
|
|
|
|
LNVCONST( 750.43163907103936624165), |
2103
|
|
|
|
|
|
|
LNVCONST( 40.205465640027706061433), |
2104
|
|
|
|
|
|
|
LNVCONST( 1.0000000000000000000000) }; |
2105
|
5
|
|
|
|
|
|
LNV sumn = C6p[0]-x*(C6p[1]-x*(C6p[2]-x*(C6p[3]-x*(C6p[4]-x*(C6p[5]-x*C6p[6]))))); |
2106
|
5
|
|
|
|
|
|
LNV sumd = C6q[0]-x*(C6q[1]-x*(C6q[2]-x*(C6q[3]-x*(C6q[4]-x*(C6q[5]-x*C6q[6]))))); |
2107
|
5
|
|
|
|
|
|
val = loglnv(-x) - sumn/sumd; |
2108
|
228
|
50
|
|
|
|
|
} else if (x < (-2 * loglnv(LNV_EPSILON))) { |
2109
|
|
|
|
|
|
|
/* Convergent series. Accurate but slow especially with large x. */ |
2110
|
228
|
|
|
|
|
|
LNV fact_n = x; |
2111
|
15320
|
50
|
|
|
|
|
for (n = 2; n <= 200; n++) { |
2112
|
15320
|
|
|
|
|
|
LNV invn = LNV_ONE / n; |
2113
|
15320
|
|
|
|
|
|
fact_n *= (LNV)x * invn; |
2114
|
15320
|
|
|
|
|
|
term = fact_n * invn; |
2115
|
15320
|
|
|
|
|
|
KAHAN_SUM(sum, term); |
2116
|
|
|
|
|
|
|
/* printf("C after adding %.20Lf, val = %.20Lf\n", term, sum); */ |
2117
|
15320
|
100
|
|
|
|
|
if (term < LNV_EPSILON*sum) break; |
2118
|
|
|
|
|
|
|
} |
2119
|
228
|
|
|
|
|
|
KAHAN_SUM(sum, euler_mascheroni); |
2120
|
228
|
|
|
|
|
|
KAHAN_SUM(sum, loglnv(x)); |
2121
|
228
|
|
|
|
|
|
KAHAN_SUM(sum, x); |
2122
|
228
|
|
|
|
|
|
val = sum; |
2123
|
0
|
0
|
|
|
|
|
} else if (x >= 24) { |
2124
|
|
|
|
|
|
|
/* Cody / Thacher rational Chebyshev */ |
2125
|
|
|
|
|
|
|
static const LNV P2[10] = { |
2126
|
|
|
|
|
|
|
LNVCONST( 1.75338801265465972390E02), |
2127
|
|
|
|
|
|
|
LNVCONST(-2.23127670777632409550E02), |
2128
|
|
|
|
|
|
|
LNVCONST(-1.81949664929868906455E01), |
2129
|
|
|
|
|
|
|
LNVCONST(-2.79798528624305389340E01), |
2130
|
|
|
|
|
|
|
LNVCONST(-7.63147701620253630855E00), |
2131
|
|
|
|
|
|
|
LNVCONST(-1.52856623636929636839E01), |
2132
|
|
|
|
|
|
|
LNVCONST(-7.06810977895029358836E00), |
2133
|
|
|
|
|
|
|
LNVCONST(-5.00006640413131002475E00), |
2134
|
|
|
|
|
|
|
LNVCONST(-3.00000000320981265753E00), |
2135
|
|
|
|
|
|
|
LNVCONST( 1.00000000000000485503E00) }; |
2136
|
|
|
|
|
|
|
static const LNV Q2[9] = { |
2137
|
|
|
|
|
|
|
LNVCONST( 3.97845977167414720840E04), |
2138
|
|
|
|
|
|
|
LNVCONST( 3.97277109100414518365E00), |
2139
|
|
|
|
|
|
|
LNVCONST( 1.37790390235747998793E02), |
2140
|
|
|
|
|
|
|
LNVCONST( 1.17179220502086455287E02), |
2141
|
|
|
|
|
|
|
LNVCONST( 7.04831847180424675988E01), |
2142
|
|
|
|
|
|
|
LNVCONST(-1.20187763547154743238E01), |
2143
|
|
|
|
|
|
|
LNVCONST(-7.99243595776339741065E00), |
2144
|
|
|
|
|
|
|
LNVCONST(-2.99999894040324959612E00), |
2145
|
|
|
|
|
|
|
LNVCONST( 1.99999999999048104167E00) }; |
2146
|
0
|
|
|
|
|
|
LNV invx = LNV_ONE / x, frac = 0.0; |
2147
|
0
|
0
|
|
|
|
|
for (n = 0; n <= 8; n++) |
2148
|
0
|
|
|
|
|
|
frac = Q2[n] / (P2[n] + x + frac); |
2149
|
0
|
|
|
|
|
|
frac += P2[9]; |
2150
|
0
|
|
|
|
|
|
val = explnv(x) * (invx + invx*invx*frac); |
2151
|
|
|
|
|
|
|
} else { |
2152
|
|
|
|
|
|
|
/* Asymptotic divergent series */ |
2153
|
0
|
|
|
|
|
|
LNV invx = LNV_ONE / x; |
2154
|
0
|
|
|
|
|
|
term = 1.0; |
2155
|
0
|
0
|
|
|
|
|
for (n = 1; n <= 200; n++) { |
2156
|
0
|
|
|
|
|
|
LNV last_term = term; |
2157
|
0
|
|
|
|
|
|
term = term * ( (LNV)n * invx ); |
2158
|
0
|
0
|
|
|
|
|
if (term < LNV_EPSILON*sum) break; |
2159
|
0
|
0
|
|
|
|
|
if (term < last_term) { |
2160
|
0
|
|
|
|
|
|
KAHAN_SUM(sum, term); |
2161
|
|
|
|
|
|
|
/* printf("A after adding %.20llf, sum = %.20llf\n", term, sum); */ |
2162
|
|
|
|
|
|
|
} else { |
2163
|
0
|
|
|
|
|
|
KAHAN_SUM(sum, (-last_term/3) ); |
2164
|
|
|
|
|
|
|
/* printf("A after adding %.20llf, sum = %.20llf\n", -last_term/3, sum); */ |
2165
|
0
|
|
|
|
|
|
break; |
2166
|
|
|
|
|
|
|
} |
2167
|
|
|
|
|
|
|
} |
2168
|
0
|
|
|
|
|
|
KAHAN_SUM(sum, LNV_ONE); |
2169
|
0
|
|
|
|
|
|
val = explnv(x) * sum * invx; |
2170
|
|
|
|
|
|
|
} |
2171
|
|
|
|
|
|
|
|
2172
|
234
|
|
|
|
|
|
return val; |
2173
|
|
|
|
|
|
|
} |
2174
|
|
|
|
|
|
|
|
2175
|
2227
|
|
|
|
|
|
NV Li(NV x) { |
2176
|
2227
|
50
|
|
|
|
|
if (x == 0) return 0; |
2177
|
2227
|
50
|
|
|
|
|
if (x == 1) return -INFINITY; |
2178
|
2227
|
50
|
|
|
|
|
if (x == 2) return li2; |
2179
|
2227
|
50
|
|
|
|
|
if (x < 0) croak("Invalid input to LogarithmicIntegral: x must be >= 0"); |
2180
|
2227
|
50
|
|
|
|
|
if (x >= NV_MAX) return INFINITY; |
2181
|
|
|
|
|
|
|
|
2182
|
|
|
|
|
|
|
/* Calculate directly using Ramanujan's series. */ |
2183
|
2227
|
50
|
|
|
|
|
if (x > 1) { |
2184
|
2227
|
|
|
|
|
|
const LNV logx = loglnv(x); |
2185
|
2227
|
|
|
|
|
|
LNV sum = 0, inner_sum = 0, old_sum, factorial = 1, power2 = 1; |
2186
|
2227
|
|
|
|
|
|
LNV q, p = -1; |
2187
|
2227
|
|
|
|
|
|
int k = 0, n = 0; |
2188
|
|
|
|
|
|
|
|
2189
|
89801
|
50
|
|
|
|
|
for (n = 1, k = 0; n < 200; n++) { |
2190
|
89801
|
|
|
|
|
|
factorial *= n; |
2191
|
89801
|
|
|
|
|
|
p *= -logx; |
2192
|
89801
|
|
|
|
|
|
q = factorial * power2; |
2193
|
89801
|
|
|
|
|
|
power2 *= 2; |
2194
|
135349
|
100
|
|
|
|
|
for (; k <= (n - 1) / 2; k++) |
2195
|
45548
|
|
|
|
|
|
inner_sum += LNV_ONE / (2 * k + 1); |
2196
|
89801
|
|
|
|
|
|
old_sum = sum; |
2197
|
89801
|
|
|
|
|
|
sum += (p / q) * inner_sum; |
2198
|
89801
|
100
|
|
|
|
|
if (fabslnv(sum - old_sum) <= LNV_EPSILON) break; |
2199
|
|
|
|
|
|
|
} |
2200
|
2227
|
|
|
|
|
|
return euler_mascheroni + loglnv(logx) + sqrtlnv(x) * sum; |
2201
|
|
|
|
|
|
|
} |
2202
|
|
|
|
|
|
|
|
2203
|
0
|
|
|
|
|
|
return Ei(loglnv(x)); |
2204
|
|
|
|
|
|
|
} |
2205
|
|
|
|
|
|
|
|
2206
|
94
|
|
|
|
|
|
static long double ld_inverse_li(long double lx) { |
2207
|
|
|
|
|
|
|
int i; |
2208
|
94
|
|
|
|
|
|
long double t, term, old_term = 0; |
2209
|
|
|
|
|
|
|
/* Iterate Halley's method until error grows. */ |
2210
|
94
|
50
|
|
|
|
|
t = (lx <= 2) ? 2 : lx * logl(lx); |
2211
|
424
|
100
|
|
|
|
|
for (i = 0; i < 4; i++) { |
2212
|
376
|
|
|
|
|
|
long double dn = Li(t) - lx; |
2213
|
376
|
|
|
|
|
|
term = dn*logl(t) / (1.0L + dn/(2*t)); |
2214
|
376
|
100
|
|
|
|
|
if (i > 0 && fabsl(term) >= fabsl(old_term)) { t -= term/4; break; } |
|
|
100
|
|
|
|
|
|
2215
|
330
|
|
|
|
|
|
old_term = term; |
2216
|
330
|
|
|
|
|
|
t -= term; |
2217
|
|
|
|
|
|
|
} |
2218
|
94
|
|
|
|
|
|
return t; |
2219
|
|
|
|
|
|
|
} |
2220
|
|
|
|
|
|
|
|
2221
|
97
|
|
|
|
|
|
UV inverse_li(UV x) { |
2222
|
|
|
|
|
|
|
UV r, i; |
2223
|
97
|
|
|
|
|
|
long double lx = (long double) x; |
2224
|
|
|
|
|
|
|
|
2225
|
97
|
100
|
|
|
|
|
if (x <= 2) return x + (x > 0); |
2226
|
94
|
|
|
|
|
|
r = (UV) ceill( ld_inverse_li(lx) ); |
2227
|
|
|
|
|
|
|
/* Meet our more stringent goal of an exact answer. */ |
2228
|
94
|
50
|
|
|
|
|
i = (x > 4e16) ? 2048 : 128; |
2229
|
94
|
50
|
|
|
|
|
if (Li(r-1) >= lx) { |
2230
|
0
|
0
|
|
|
|
|
while (Li(r-i) >= lx) r -= i; |
2231
|
0
|
0
|
|
|
|
|
for (i = i/2; i > 0; i /= 2) |
2232
|
0
|
0
|
|
|
|
|
if (Li(r-i) >= lx) r -= i; |
2233
|
|
|
|
|
|
|
} else { |
2234
|
94
|
50
|
|
|
|
|
while (Li(r+i-1) < lx) r += i; |
2235
|
752
|
100
|
|
|
|
|
for (i = i/2; i > 0; i /= 2) |
2236
|
658
|
50
|
|
|
|
|
if (Li(r+i-1) < lx) r += i; |
2237
|
|
|
|
|
|
|
} |
2238
|
94
|
|
|
|
|
|
return r; |
2239
|
|
|
|
|
|
|
} |
2240
|
|
|
|
|
|
|
|
2241
|
23
|
|
|
|
|
|
static long double ld_inverse_R(long double lx) { |
2242
|
|
|
|
|
|
|
int i; |
2243
|
23
|
|
|
|
|
|
long double t, dn, term, old_term = 0; |
2244
|
|
|
|
|
|
|
|
2245
|
|
|
|
|
|
|
/* Rough estimate */ |
2246
|
23
|
50
|
|
|
|
|
if (lx <= 3.5) { |
2247
|
0
|
|
|
|
|
|
t = lx + 2.24*(lx-1)/2; |
2248
|
|
|
|
|
|
|
} else { |
2249
|
23
|
|
|
|
|
|
t = lx * logl(lx); |
2250
|
23
|
50
|
|
|
|
|
if (lx < 50) { t *= 1.2; } |
2251
|
23
|
100
|
|
|
|
|
else if (lx < 1000) { t *= 1.15; } |
2252
|
|
|
|
|
|
|
else { /* use inverse Li (one iteration) for first inverse R approx */ |
2253
|
22
|
|
|
|
|
|
dn = Li(t) - lx; |
2254
|
22
|
|
|
|
|
|
term = dn * logl(t) / (1.0L + dn/(2*t)); |
2255
|
22
|
|
|
|
|
|
t -= term; |
2256
|
|
|
|
|
|
|
} |
2257
|
|
|
|
|
|
|
} |
2258
|
|
|
|
|
|
|
/* Iterate 1-n rounds of Halley, usually only 3 needed. */ |
2259
|
116
|
50
|
|
|
|
|
for (i = 0; i < 100; i++) { |
2260
|
116
|
|
|
|
|
|
dn = RiemannR(t) - lx; |
2261
|
|
|
|
|
|
|
#if 1 /* Use f(t) = li(t) for derivatives */ |
2262
|
116
|
|
|
|
|
|
term = dn * logl(t) / (1.0L + dn/(2*t)); |
2263
|
|
|
|
|
|
|
#else /* Use f(t) = li(t) - li(sqrt(t))/2 for derivatives */ |
2264
|
|
|
|
|
|
|
long double logt = logl(t); |
2265
|
|
|
|
|
|
|
long double sqrtt = sqrtl(t); |
2266
|
|
|
|
|
|
|
long double FA = 2 * sqrtt * logt; |
2267
|
|
|
|
|
|
|
long double FB = 2 * sqrtt - 1; |
2268
|
|
|
|
|
|
|
long double ifz = FA / FB; |
2269
|
|
|
|
|
|
|
long double iffz = (logt - 2*FB) / (2 * sqrtt * FA * FA * FA * FA); |
2270
|
|
|
|
|
|
|
term = dn * ifz * (1.0L - dn * iffz); |
2271
|
|
|
|
|
|
|
#endif |
2272
|
116
|
100
|
|
|
|
|
if (i > 0 && fabsl(term) >= fabsl(old_term)) { t -= term/4; break; } |
|
|
100
|
|
|
|
|
|
2273
|
93
|
|
|
|
|
|
old_term = term; |
2274
|
93
|
|
|
|
|
|
t -= term; |
2275
|
|
|
|
|
|
|
} |
2276
|
23
|
|
|
|
|
|
return t; |
2277
|
|
|
|
|
|
|
} |
2278
|
|
|
|
|
|
|
|
2279
|
23
|
|
|
|
|
|
UV inverse_R(UV x) { |
2280
|
23
|
50
|
|
|
|
|
if (x < 2) return x + (x > 0); |
2281
|
23
|
|
|
|
|
|
return (UV) ceill( ld_inverse_R( (long double) x) ); |
2282
|
|
|
|
|
|
|
} |
2283
|
|
|
|
|
|
|
|
2284
|
|
|
|
|
|
|
|
2285
|
|
|
|
|
|
|
/* |
2286
|
|
|
|
|
|
|
* Storing the first 10-20 Zeta values makes sense. Past that it is purely |
2287
|
|
|
|
|
|
|
* to avoid making the call to generate them ourselves. We could cache the |
2288
|
|
|
|
|
|
|
* calculated values. These all have 1 subtracted from them. */ |
2289
|
|
|
|
|
|
|
static const long double riemann_zeta_table[] = { |
2290
|
|
|
|
|
|
|
0.6449340668482264364724151666460251892L, /* zeta(2) */ |
2291
|
|
|
|
|
|
|
0.2020569031595942853997381615114499908L, |
2292
|
|
|
|
|
|
|
0.0823232337111381915160036965411679028L, |
2293
|
|
|
|
|
|
|
0.0369277551433699263313654864570341681L, |
2294
|
|
|
|
|
|
|
0.0173430619844491397145179297909205279L, |
2295
|
|
|
|
|
|
|
0.0083492773819228268397975498497967596L, |
2296
|
|
|
|
|
|
|
0.0040773561979443393786852385086524653L, |
2297
|
|
|
|
|
|
|
0.0020083928260822144178527692324120605L, |
2298
|
|
|
|
|
|
|
0.0009945751278180853371459589003190170L, |
2299
|
|
|
|
|
|
|
0.0004941886041194645587022825264699365L, |
2300
|
|
|
|
|
|
|
0.0002460865533080482986379980477396710L, |
2301
|
|
|
|
|
|
|
0.0001227133475784891467518365263573957L, |
2302
|
|
|
|
|
|
|
0.0000612481350587048292585451051353337L, |
2303
|
|
|
|
|
|
|
0.0000305882363070204935517285106450626L, |
2304
|
|
|
|
|
|
|
0.0000152822594086518717325714876367220L, |
2305
|
|
|
|
|
|
|
0.0000076371976378997622736002935630292L, /* zeta(17) Past here all we're */ |
2306
|
|
|
|
|
|
|
0.0000038172932649998398564616446219397L, /* zeta(18) getting is speed. */ |
2307
|
|
|
|
|
|
|
0.0000019082127165539389256569577951013L, |
2308
|
|
|
|
|
|
|
0.0000009539620338727961131520386834493L, |
2309
|
|
|
|
|
|
|
0.0000004769329867878064631167196043730L, |
2310
|
|
|
|
|
|
|
0.0000002384505027277329900036481867530L, |
2311
|
|
|
|
|
|
|
0.0000001192199259653110730677887188823L, |
2312
|
|
|
|
|
|
|
0.0000000596081890512594796124402079358L, |
2313
|
|
|
|
|
|
|
0.0000000298035035146522801860637050694L, |
2314
|
|
|
|
|
|
|
0.0000000149015548283650412346585066307L, |
2315
|
|
|
|
|
|
|
0.0000000074507117898354294919810041706L, |
2316
|
|
|
|
|
|
|
0.0000000037253340247884570548192040184L, |
2317
|
|
|
|
|
|
|
0.0000000018626597235130490064039099454L, |
2318
|
|
|
|
|
|
|
0.0000000009313274324196681828717647350L, |
2319
|
|
|
|
|
|
|
0.0000000004656629065033784072989233251L, |
2320
|
|
|
|
|
|
|
0.0000000002328311833676505492001455976L, |
2321
|
|
|
|
|
|
|
0.0000000001164155017270051977592973835L, |
2322
|
|
|
|
|
|
|
0.0000000000582077208790270088924368599L, |
2323
|
|
|
|
|
|
|
0.0000000000291038504449709968692942523L, |
2324
|
|
|
|
|
|
|
0.0000000000145519218910419842359296322L, |
2325
|
|
|
|
|
|
|
0.0000000000072759598350574810145208690L, |
2326
|
|
|
|
|
|
|
0.0000000000036379795473786511902372363L, |
2327
|
|
|
|
|
|
|
0.0000000000018189896503070659475848321L, |
2328
|
|
|
|
|
|
|
0.0000000000009094947840263889282533118L, |
2329
|
|
|
|
|
|
|
0.0000000000004547473783042154026799112L, |
2330
|
|
|
|
|
|
|
0.0000000000002273736845824652515226821L, |
2331
|
|
|
|
|
|
|
0.0000000000001136868407680227849349105L, |
2332
|
|
|
|
|
|
|
0.0000000000000568434198762758560927718L, |
2333
|
|
|
|
|
|
|
0.0000000000000284217097688930185545507L, |
2334
|
|
|
|
|
|
|
0.0000000000000142108548280316067698343L, |
2335
|
|
|
|
|
|
|
0.00000000000000710542739521085271287735L, |
2336
|
|
|
|
|
|
|
0.00000000000000355271369133711367329847L, |
2337
|
|
|
|
|
|
|
0.00000000000000177635684357912032747335L, |
2338
|
|
|
|
|
|
|
0.000000000000000888178421093081590309609L, |
2339
|
|
|
|
|
|
|
0.000000000000000444089210314381336419777L, |
2340
|
|
|
|
|
|
|
0.000000000000000222044605079804198399932L, |
2341
|
|
|
|
|
|
|
0.000000000000000111022302514106613372055L, |
2342
|
|
|
|
|
|
|
0.0000000000000000555111512484548124372374L, |
2343
|
|
|
|
|
|
|
0.0000000000000000277555756213612417258163L, |
2344
|
|
|
|
|
|
|
0.0000000000000000138777878097252327628391L, |
2345
|
|
|
|
|
|
|
}; |
2346
|
|
|
|
|
|
|
#define NPRECALC_ZETA (sizeof(riemann_zeta_table)/sizeof(riemann_zeta_table[0])) |
2347
|
|
|
|
|
|
|
|
2348
|
|
|
|
|
|
|
/* Riemann Zeta on the real line, with 1 subtracted. |
2349
|
|
|
|
|
|
|
* Compare to Math::Cephes zetac. Also zeta with q=1 and subtracting 1. |
2350
|
|
|
|
|
|
|
* |
2351
|
|
|
|
|
|
|
* The Cephes zeta function uses a series (2k)!/B_2k which converges rapidly |
2352
|
|
|
|
|
|
|
* and has a very wide range of values. We use it here for some values. |
2353
|
|
|
|
|
|
|
* |
2354
|
|
|
|
|
|
|
* Note: Calculations here are done on long doubles and we try to generate as |
2355
|
|
|
|
|
|
|
* much accuracy as possible. They will get returned to Perl as an NV, |
2356
|
|
|
|
|
|
|
* which is typically a 64-bit double with 15 digits. |
2357
|
|
|
|
|
|
|
* |
2358
|
|
|
|
|
|
|
* For values 0.5 to 5, this code uses the rational Chebyshev approximation |
2359
|
|
|
|
|
|
|
* from Cody and Thacher. This method is extraordinarily fast and very |
2360
|
|
|
|
|
|
|
* accurate over its range (slightly better than Cephes for most values). If |
2361
|
|
|
|
|
|
|
* we had quad floats, we could use the 9-term polynomial. |
2362
|
|
|
|
|
|
|
*/ |
2363
|
3049
|
|
|
|
|
|
long double ld_riemann_zeta(long double x) { |
2364
|
|
|
|
|
|
|
int i; |
2365
|
|
|
|
|
|
|
|
2366
|
3049
|
50
|
|
|
|
|
if (x < 0) croak("Invalid input to RiemannZeta: x must be >= 0"); |
2367
|
3049
|
50
|
|
|
|
|
if (x == 1) return INFINITY; |
2368
|
|
|
|
|
|
|
|
2369
|
3049
|
100
|
|
|
|
|
if (x == (unsigned int)x) { |
2370
|
3045
|
|
|
|
|
|
int k = x - 2; |
2371
|
3045
|
50
|
|
|
|
|
if ((k >= 0) && (k < (int)NPRECALC_ZETA)) |
|
|
100
|
|
|
|
|
|
2372
|
2
|
|
|
|
|
|
return riemann_zeta_table[k]; |
2373
|
|
|
|
|
|
|
} |
2374
|
|
|
|
|
|
|
|
2375
|
|
|
|
|
|
|
/* Cody / Thacher rational Chebyshev approximation for small values */ |
2376
|
3047
|
50
|
|
|
|
|
if (x >= 0.5 && x <= 5.0) { |
|
|
100
|
|
|
|
|
|
2377
|
|
|
|
|
|
|
static const long double C8p[9] = { 1.287168121482446392809e10L, |
2378
|
|
|
|
|
|
|
1.375396932037025111825e10L, |
2379
|
|
|
|
|
|
|
5.106655918364406103683e09L, |
2380
|
|
|
|
|
|
|
8.561471002433314862469e08L, |
2381
|
|
|
|
|
|
|
7.483618124380232984824e07L, |
2382
|
|
|
|
|
|
|
4.860106585461882511535e06L, |
2383
|
|
|
|
|
|
|
2.739574990221406087728e05L, |
2384
|
|
|
|
|
|
|
4.631710843183427123061e03L, |
2385
|
|
|
|
|
|
|
5.787581004096660659109e01L }; |
2386
|
|
|
|
|
|
|
static const long double C8q[9] = { 2.574336242964846244667e10L, |
2387
|
|
|
|
|
|
|
5.938165648679590160003e09L, |
2388
|
|
|
|
|
|
|
9.006330373261233439089e08L, |
2389
|
|
|
|
|
|
|
8.042536634283289888587e07L, |
2390
|
|
|
|
|
|
|
5.609711759541920062814e06L, |
2391
|
|
|
|
|
|
|
2.247431202899137523543e05L, |
2392
|
|
|
|
|
|
|
7.574578909341537560115e03L, |
2393
|
|
|
|
|
|
|
-2.373835781373772623086e01L, |
2394
|
|
|
|
|
|
|
1.000000000000000000000L }; |
2395
|
2
|
|
|
|
|
|
long double sumn = C8p[0]+x*(C8p[1]+x*(C8p[2]+x*(C8p[3]+x*(C8p[4]+x*(C8p[5]+x*(C8p[6]+x*(C8p[7]+x*C8p[8]))))))); |
2396
|
2
|
|
|
|
|
|
long double sumd = C8q[0]+x*(C8q[1]+x*(C8q[2]+x*(C8q[3]+x*(C8q[4]+x*(C8q[5]+x*(C8q[6]+x*(C8q[7]+x*C8q[8]))))))); |
2397
|
2
|
|
|
|
|
|
long double sum = (sumn - (x-1)*sumd) / ((x-1)*sumd); |
2398
|
2
|
|
|
|
|
|
return sum; |
2399
|
|
|
|
|
|
|
} |
2400
|
|
|
|
|
|
|
|
2401
|
3045
|
50
|
|
|
|
|
if (x > 17000.0) |
2402
|
0
|
|
|
|
|
|
return 0.0; |
2403
|
|
|
|
|
|
|
|
2404
|
|
|
|
|
|
|
#if 0 |
2405
|
|
|
|
|
|
|
{ |
2406
|
|
|
|
|
|
|
KAHAN_INIT(sum); |
2407
|
|
|
|
|
|
|
/* Simple defining series, works well. */ |
2408
|
|
|
|
|
|
|
for (i = 5; i <= 1000000; i++) { |
2409
|
|
|
|
|
|
|
long double term = powl(i, -x); |
2410
|
|
|
|
|
|
|
KAHAN_SUM(sum, term); |
2411
|
|
|
|
|
|
|
if (term < LDBL_EPSILON*sum) break; |
2412
|
|
|
|
|
|
|
} |
2413
|
|
|
|
|
|
|
KAHAN_SUM(sum, powl(4, -x) ); |
2414
|
|
|
|
|
|
|
KAHAN_SUM(sum, powl(3, -x) ); |
2415
|
|
|
|
|
|
|
KAHAN_SUM(sum, powl(2, -x) ); |
2416
|
|
|
|
|
|
|
return sum; |
2417
|
|
|
|
|
|
|
} |
2418
|
|
|
|
|
|
|
#endif |
2419
|
|
|
|
|
|
|
|
2420
|
|
|
|
|
|
|
/* The 2n!/B_2k series used by the Cephes library. */ |
2421
|
|
|
|
|
|
|
{ |
2422
|
|
|
|
|
|
|
/* gp/pari: |
2423
|
|
|
|
|
|
|
* for(i=1,13,printf("%.38g\n",(2*i)!/bernreal(2*i))) |
2424
|
|
|
|
|
|
|
* MPU: |
2425
|
|
|
|
|
|
|
* use bignum; |
2426
|
|
|
|
|
|
|
* say +(factorial(2*$_)/bernreal(2*$_))->bround(38) for 1..13; |
2427
|
|
|
|
|
|
|
*/ |
2428
|
|
|
|
|
|
|
static const long double A[] = { |
2429
|
|
|
|
|
|
|
12.0L, |
2430
|
|
|
|
|
|
|
-720.0L, |
2431
|
|
|
|
|
|
|
30240.0L, |
2432
|
|
|
|
|
|
|
-1209600.0L, |
2433
|
|
|
|
|
|
|
47900160.0L, |
2434
|
|
|
|
|
|
|
-1892437580.3183791606367583212735166425L, |
2435
|
|
|
|
|
|
|
74724249600.0L, |
2436
|
|
|
|
|
|
|
-2950130727918.1642244954382084600497650L, |
2437
|
|
|
|
|
|
|
116467828143500.67248729113000661089201L, |
2438
|
|
|
|
|
|
|
-4597978722407472.6105457273596737891656L, |
2439
|
|
|
|
|
|
|
181521054019435467.73425331153534235290L, |
2440
|
|
|
|
|
|
|
-7166165256175667011.3346447367083352775L, |
2441
|
|
|
|
|
|
|
282908877253042996618.18640556532523927L, |
2442
|
|
|
|
|
|
|
}; |
2443
|
|
|
|
|
|
|
long double a, b, s, t; |
2444
|
3045
|
|
|
|
|
|
const long double w = 10.0; |
2445
|
3045
|
|
|
|
|
|
s = 0.0; |
2446
|
3045
|
|
|
|
|
|
b = 0.0; |
2447
|
9778
|
100
|
|
|
|
|
for (i = 2; i < 11; i++) { |
2448
|
9776
|
|
|
|
|
|
b = powl( i, -x ); |
2449
|
9776
|
|
|
|
|
|
s += b; |
2450
|
9776
|
100
|
|
|
|
|
if (fabsl(b) < fabsl(LDBL_EPSILON * s)) |
2451
|
3043
|
|
|
|
|
|
return s; |
2452
|
|
|
|
|
|
|
} |
2453
|
2
|
|
|
|
|
|
s = s + b*w/(x-1.0) - 0.5 * b; |
2454
|
2
|
|
|
|
|
|
a = 1.0; |
2455
|
19
|
50
|
|
|
|
|
for (i = 0; i < 13; i++) { |
2456
|
19
|
|
|
|
|
|
long double k = 2*i; |
2457
|
19
|
|
|
|
|
|
a *= x + k; |
2458
|
19
|
|
|
|
|
|
b /= w; |
2459
|
19
|
|
|
|
|
|
t = a*b/A[i]; |
2460
|
19
|
|
|
|
|
|
s = s + t; |
2461
|
19
|
100
|
|
|
|
|
if (fabsl(t) < fabsl(LDBL_EPSILON * s)) |
2462
|
2
|
|
|
|
|
|
break; |
2463
|
17
|
|
|
|
|
|
a *= x + k + 1.0; |
2464
|
17
|
|
|
|
|
|
b /= w; |
2465
|
|
|
|
|
|
|
} |
2466
|
2
|
|
|
|
|
|
return s; |
2467
|
|
|
|
|
|
|
} |
2468
|
|
|
|
|
|
|
} |
2469
|
|
|
|
|
|
|
|
2470
|
150
|
|
|
|
|
|
long double RiemannR(long double x) { |
2471
|
|
|
|
|
|
|
long double part_term, term, flogx, ki, old_sum; |
2472
|
|
|
|
|
|
|
unsigned int k; |
2473
|
150
|
|
|
|
|
|
KAHAN_INIT(sum); |
2474
|
|
|
|
|
|
|
|
2475
|
150
|
50
|
|
|
|
|
if (x <= 0) croak("Invalid input to RiemannR: x must be > 0"); |
2476
|
|
|
|
|
|
|
|
2477
|
150
|
100
|
|
|
|
|
if (x > 1e19) { |
2478
|
2
|
|
|
|
|
|
const signed char* amob = range_moebius(0, 100); |
2479
|
2
|
|
|
|
|
|
KAHAN_SUM(sum, Li(x)); |
2480
|
132
|
50
|
|
|
|
|
for (k = 2; k <= 100; k++) { |
2481
|
132
|
100
|
|
|
|
|
if (amob[k] == 0) continue; |
2482
|
82
|
|
|
|
|
|
ki = 1.0L / (long double) k; |
2483
|
82
|
|
|
|
|
|
part_term = powl(x,ki); |
2484
|
82
|
50
|
|
|
|
|
if (part_term > LDBL_MAX) return INFINITY; |
2485
|
82
|
|
|
|
|
|
term = amob[k] * ki * Li(part_term); |
2486
|
82
|
|
|
|
|
|
old_sum = sum; |
2487
|
82
|
|
|
|
|
|
KAHAN_SUM(sum, term); |
2488
|
82
|
100
|
|
|
|
|
if (fabsl(sum - old_sum) <= LDBL_EPSILON) break; |
2489
|
|
|
|
|
|
|
} |
2490
|
2
|
|
|
|
|
|
Safefree(amob); |
2491
|
2
|
|
|
|
|
|
return sum; |
2492
|
|
|
|
|
|
|
} |
2493
|
|
|
|
|
|
|
|
2494
|
148
|
|
|
|
|
|
KAHAN_SUM(sum, 1.0); |
2495
|
148
|
|
|
|
|
|
flogx = logl(x); |
2496
|
148
|
|
|
|
|
|
part_term = 1; |
2497
|
|
|
|
|
|
|
|
2498
|
10829
|
50
|
|
|
|
|
for (k = 1; k <= 10000; k++) { |
2499
|
10829
|
100
|
|
|
|
|
ki = (k-1 < NPRECALC_ZETA) ? riemann_zeta_table[k-1] : ld_riemann_zeta(k+1); |
2500
|
10829
|
|
|
|
|
|
part_term *= flogx / k; |
2501
|
10829
|
|
|
|
|
|
term = part_term / (k + k * ki); |
2502
|
10829
|
|
|
|
|
|
old_sum = sum; |
2503
|
10829
|
|
|
|
|
|
KAHAN_SUM(sum, term); |
2504
|
|
|
|
|
|
|
/* printf("R %5d after adding %.18Lg, sum = %.19Lg (%Lg)\n", k, term, sum, fabsl(sum-old_sum)); */ |
2505
|
10829
|
100
|
|
|
|
|
if (fabsl(sum - old_sum) <= LDBL_EPSILON) break; |
2506
|
|
|
|
|
|
|
} |
2507
|
|
|
|
|
|
|
|
2508
|
148
|
|
|
|
|
|
return sum; |
2509
|
|
|
|
|
|
|
} |
2510
|
|
|
|
|
|
|
|
2511
|
8
|
|
|
|
|
|
static long double _lambertw_approx(long double x) { |
2512
|
|
|
|
|
|
|
/* See Veberic 2009 for other approximations */ |
2513
|
8
|
100
|
|
|
|
|
if (x < -0.060) { /* Pade(3,2) */ |
2514
|
2
|
|
|
|
|
|
long double ti = 5.4365636569180904707205749L * x + 2.0L; |
2515
|
2
|
50
|
|
|
|
|
long double t = (ti <= 0.0L) ? 0.0L : sqrtl(ti); |
2516
|
2
|
|
|
|
|
|
long double t2 = t*t; |
2517
|
2
|
|
|
|
|
|
long double t3 = t*t2; |
2518
|
2
|
|
|
|
|
|
return (-1.0L + (1.0L/6.0L)*t + (257.0L/720.0L)*t2 + (13.0L/720.0L)*t3) / (1.0L + (5.0L/6.0L)*t + (103.0L/720.0L)*t2); |
2519
|
6
|
100
|
|
|
|
|
} else if (x < 1.363) { /* Winitzki 2003 section 3.5 */ |
2520
|
2
|
|
|
|
|
|
long double l1 = logl(1.0L+x); |
2521
|
2
|
|
|
|
|
|
return l1 * (1.0L - logl(1.0L+l1) / (2.0L+l1)); |
2522
|
4
|
50
|
|
|
|
|
} else if (x < 3.7) { /* Modification of Vargas 2013 */ |
2523
|
0
|
|
|
|
|
|
long double l1 = logl(x); |
2524
|
0
|
|
|
|
|
|
long double l2 = logl(l1); |
2525
|
0
|
|
|
|
|
|
return l1 - l2 - logl(1.0L - l2/l1)/2.0L; |
2526
|
|
|
|
|
|
|
} else { /* Corless et al. 1993, page 22 */ |
2527
|
4
|
|
|
|
|
|
long double l1 = logl(x); |
2528
|
4
|
|
|
|
|
|
long double l2 = logl(l1); |
2529
|
4
|
|
|
|
|
|
long double d1 = 2.0L*l1*l1; |
2530
|
4
|
|
|
|
|
|
long double d2 = 3.0L*l1*d1; |
2531
|
4
|
|
|
|
|
|
long double d3 = 2.0L*l1*d2; |
2532
|
4
|
|
|
|
|
|
long double d4 = 5.0L*l1*d3; |
2533
|
4
|
|
|
|
|
|
long double w = l1 - l2 + l2/l1 + l2*(l2-2.0L)/d1; |
2534
|
4
|
|
|
|
|
|
w += l2*(6.0L+l2*(-9.0L+2.0L*l2))/d2; |
2535
|
4
|
|
|
|
|
|
w += l2*(-12.0L+l2*(36.0L+l2*(-22.0L+3.0L*l2)))/d3; |
2536
|
4
|
|
|
|
|
|
w += l2*(60.0L+l2*(-300.0L+l2*(350.0L+l2*(-125.0L+12.0L*l2))))/d4; |
2537
|
4
|
|
|
|
|
|
return w; |
2538
|
|
|
|
|
|
|
} |
2539
|
|
|
|
|
|
|
} |
2540
|
|
|
|
|
|
|
|
2541
|
9
|
|
|
|
|
|
NV lambertw(NV x) { |
2542
|
|
|
|
|
|
|
long double w; |
2543
|
|
|
|
|
|
|
int i; |
2544
|
|
|
|
|
|
|
|
2545
|
9
|
50
|
|
|
|
|
if (x < -0.36787944117145L) |
2546
|
0
|
|
|
|
|
|
croak("Invalid input to LambertW: x must be >= -1/e"); |
2547
|
9
|
100
|
|
|
|
|
if (x == 0.0L) return 0.0L; |
2548
|
|
|
|
|
|
|
|
2549
|
|
|
|
|
|
|
/* Estimate initial value */ |
2550
|
8
|
|
|
|
|
|
w = _lambertw_approx(x); |
2551
|
|
|
|
|
|
|
/* If input is too small, return .99999.... */ |
2552
|
8
|
50
|
|
|
|
|
if (w <= -1.0L) return -1.0L + 8*LDBL_EPSILON; |
2553
|
|
|
|
|
|
|
/* For very small inputs, don't iterate, return approx directly. */ |
2554
|
8
|
100
|
|
|
|
|
if (x < -0.36783) return w; |
2555
|
|
|
|
|
|
|
|
2556
|
|
|
|
|
|
|
#if 0 /* Halley */ |
2557
|
|
|
|
|
|
|
lastw = w; |
2558
|
|
|
|
|
|
|
for (i = 0; i < 100; i++) { |
2559
|
|
|
|
|
|
|
long double ew = expl(w); |
2560
|
|
|
|
|
|
|
long double wew = w * ew; |
2561
|
|
|
|
|
|
|
long double wewx = wew - x; |
2562
|
|
|
|
|
|
|
long double w1 = w + 1; |
2563
|
|
|
|
|
|
|
w = w - wewx / (ew * w1 - (w+2) * wewx/(2*w1)); |
2564
|
|
|
|
|
|
|
if (w != 0.0L && fabsl((w-lastw)/w) <= 8*LDBL_EPSILON) break; |
2565
|
|
|
|
|
|
|
lastw = w; |
2566
|
|
|
|
|
|
|
} |
2567
|
|
|
|
|
|
|
#else /* Fritsch, see Veberic 2009. 1-2 iterations are enough. */ |
2568
|
30
|
100
|
|
|
|
|
for (i = 0; i < 6 && w != 0.0L; i++) { |
|
|
50
|
|
|
|
|
|
2569
|
28
|
|
|
|
|
|
long double w1 = 1 + w; |
2570
|
28
|
|
|
|
|
|
long double zn = logl((long double)x/w) - w; |
2571
|
28
|
|
|
|
|
|
long double qn = 2 * w1 * (w1+(2.0L/3.0L)*zn); |
2572
|
28
|
|
|
|
|
|
long double en = (zn/w1) * (qn-zn)/(qn-2.0L*zn); |
2573
|
|
|
|
|
|
|
/* w *= 1.0L + en; if (fabsl(en) <= 16*LDBL_EPSILON) break; */ |
2574
|
28
|
|
|
|
|
|
long double wen = w * en; |
2575
|
28
|
|
|
|
|
|
w += wen; |
2576
|
28
|
100
|
|
|
|
|
if (fabsl(wen) <= 64*LDBL_EPSILON) break; |
2577
|
|
|
|
|
|
|
} |
2578
|
|
|
|
|
|
|
#endif |
2579
|
|
|
|
|
|
|
#if LNV_IS_QUAD /* For quadmath, one high precision correction */ |
2580
|
|
|
|
|
|
|
if (w != LNV_ZERO) { |
2581
|
|
|
|
|
|
|
LNV lw = w; |
2582
|
|
|
|
|
|
|
LNV w1 = LNV_ONE + lw; |
2583
|
|
|
|
|
|
|
LNV zn = loglnv((LNV)x/lw) - lw; |
2584
|
|
|
|
|
|
|
LNV qn = LNVCONST(2.0) * w1 * (w1+(LNVCONST(2.0)/LNVCONST(3.0))*zn); |
2585
|
|
|
|
|
|
|
LNV en = (zn/w1) * (qn-zn)/(qn-LNVCONST(2.0)*zn); |
2586
|
|
|
|
|
|
|
return lw + lw * en; |
2587
|
|
|
|
|
|
|
} |
2588
|
|
|
|
|
|
|
#endif |
2589
|
|
|
|
|
|
|
|
2590
|
7
|
|
|
|
|
|
return w; |
2591
|
|
|
|
|
|
|
} |
2592
|
|
|
|
|
|
|
|
2593
|
|
|
|
|
|
|
#if HAVE_STD_U64 |
2594
|
|
|
|
|
|
|
#define U64T uint64_t |
2595
|
|
|
|
|
|
|
#else |
2596
|
|
|
|
|
|
|
#define U64T UV |
2597
|
|
|
|
|
|
|
#endif |
2598
|
|
|
|
|
|
|
|
2599
|
|
|
|
|
|
|
/* Spigot from Arndt, Haenel, Winter, and Flammenkamp. */ |
2600
|
|
|
|
|
|
|
/* Modified for larger digits and rounding by Dana Jacobsen */ |
2601
|
987
|
|
|
|
|
|
char* pidigits(int digits) |
2602
|
|
|
|
|
|
|
{ |
2603
|
|
|
|
|
|
|
char* out; |
2604
|
|
|
|
|
|
|
uint32_t *a, b, c, d, e, g, i, d4, d3, d2, d1; |
2605
|
987
|
|
|
|
|
|
uint32_t const f = 10000; |
2606
|
|
|
|
|
|
|
U64T d64; /* 64-bit intermediate for 2*2*10000*b > 2^32 (~30k digits) */ |
2607
|
|
|
|
|
|
|
|
2608
|
987
|
50
|
|
|
|
|
if (digits <= 0) return 0; |
2609
|
987
|
100
|
|
|
|
|
if (digits <= DBL_DIG && digits <= 18) { |
|
|
50
|
|
|
|
|
|
2610
|
15
|
|
|
|
|
|
Newz(0, out, 19, char); |
2611
|
15
|
|
|
|
|
|
(void)sprintf(out, "%.*lf", (digits-1), 3.141592653589793238); |
2612
|
15
|
|
|
|
|
|
return out; |
2613
|
|
|
|
|
|
|
} |
2614
|
972
|
|
|
|
|
|
digits++; /* For rounding */ |
2615
|
972
|
|
|
|
|
|
c = 14*(digits/4 + 2); |
2616
|
972
|
|
|
|
|
|
New(0, out, digits+5+1, char); |
2617
|
972
|
|
|
|
|
|
*out++ = '3'; /* We'll turn "31415..." into "3.1415..." */ |
2618
|
972
|
50
|
|
|
|
|
New(0, a, c, uint32_t); |
2619
|
1776998
|
100
|
|
|
|
|
for (b = 0; b < c; b++) a[b] = 2000; |
2620
|
|
|
|
|
|
|
|
2621
|
972
|
|
|
|
|
|
d = i = 0; |
2622
|
126616
|
100
|
|
|
|
|
while ((b = c -= 14) > 0 && i < (uint32_t)digits) { |
|
|
100
|
|
|
|
|
|
2623
|
125644
|
|
|
|
|
|
d = e = d % f; |
2624
|
125644
|
50
|
|
|
|
|
if (b > 107000) { /* Use 64-bit intermediate while necessary. */ |
2625
|
0
|
0
|
|
|
|
|
for (d64 = d; --b > 107000; ) { |
2626
|
0
|
|
|
|
|
|
g = (b << 1) - 1; |
2627
|
0
|
|
|
|
|
|
d64 = d64 * b + f * (U64T)a[b]; |
2628
|
0
|
|
|
|
|
|
a[b] = d64 % g; |
2629
|
0
|
|
|
|
|
|
d64 /= g; |
2630
|
|
|
|
|
|
|
} |
2631
|
0
|
|
|
|
|
|
d = d64; |
2632
|
0
|
|
|
|
|
|
b++; |
2633
|
|
|
|
|
|
|
} |
2634
|
148467144
|
100
|
|
|
|
|
while (--b > 0) { |
2635
|
148341500
|
|
|
|
|
|
g = (b << 1) - 1; |
2636
|
148341500
|
|
|
|
|
|
d = d * b + f * a[b]; |
2637
|
148341500
|
|
|
|
|
|
a[b] = d % g; |
2638
|
148341500
|
|
|
|
|
|
d /= g; |
2639
|
|
|
|
|
|
|
} |
2640
|
|
|
|
|
|
|
/* sprintf(out+i, "%04d", e+d/f); i += 4; */ |
2641
|
125644
|
|
|
|
|
|
d4 = e + d/f; |
2642
|
125644
|
50
|
|
|
|
|
if (d4 > 9999) { |
2643
|
0
|
|
|
|
|
|
d4 -= 10000; |
2644
|
0
|
|
|
|
|
|
out[i-1]++; |
2645
|
0
|
0
|
|
|
|
|
for (b=i-1; out[b] == '0'+1; b--) { out[b]='0'; out[b-1]++; } |
2646
|
|
|
|
|
|
|
} |
2647
|
125644
|
|
|
|
|
|
d3 = d4/10; d2 = d3/10; d1 = d2/10; |
2648
|
125644
|
|
|
|
|
|
out[i++] = '0' + d1; |
2649
|
125644
|
|
|
|
|
|
out[i++] = '0' + d2-d1*10; |
2650
|
125644
|
|
|
|
|
|
out[i++] = '0' + d3-d2*10; |
2651
|
125644
|
|
|
|
|
|
out[i++] = '0' + d4-d3*10; |
2652
|
|
|
|
|
|
|
} |
2653
|
972
|
|
|
|
|
|
Safefree(a); |
2654
|
972
|
100
|
|
|
|
|
if (out[digits-1] >= '5') out[digits-2]++; /* Round */ |
2655
|
1042
|
100
|
|
|
|
|
for (i = digits-2; out[i] == '9'+1; i--) /* Keep rounding */ |
2656
|
70
|
|
|
|
|
|
{ out[i] = '0'; out[i-1]++; } |
2657
|
972
|
|
|
|
|
|
digits--; /* Undo the extra digit we used for rounding */ |
2658
|
972
|
|
|
|
|
|
out[digits] = '\0'; |
2659
|
972
|
|
|
|
|
|
*out-- = '.'; |
2660
|
972
|
|
|
|
|
|
return out; |
2661
|
|
|
|
|
|
|
} |
2662
|
|
|
|
|
|
|
|
2663
|
|
|
|
|
|
|
/* 1. Perform signed integer validation on b/blen. |
2664
|
|
|
|
|
|
|
* 2. Compare to a/alen using min or max based on first arg. |
2665
|
|
|
|
|
|
|
* 3. Return 0 to select a, 1 to select b. |
2666
|
|
|
|
|
|
|
*/ |
2667
|
4
|
|
|
|
|
|
int strnum_minmax(int min, char* a, STRLEN alen, char* b, STRLEN blen) |
2668
|
|
|
|
|
|
|
{ |
2669
|
|
|
|
|
|
|
int aneg, bneg; |
2670
|
|
|
|
|
|
|
STRLEN i; |
2671
|
|
|
|
|
|
|
/* a is checked, process b */ |
2672
|
4
|
50
|
|
|
|
|
if (b == 0 || blen == 0) croak("Parameter must be a positive integer"); |
|
|
50
|
|
|
|
|
|
2673
|
4
|
|
|
|
|
|
bneg = (b[0] == '-'); |
2674
|
4
|
50
|
|
|
|
|
if (b[0] == '-' || b[0] == '+') { b++; blen--; } |
|
|
50
|
|
|
|
|
|
2675
|
4
|
50
|
|
|
|
|
while (blen > 0 && *b == '0') { b++; blen--; } |
|
|
50
|
|
|
|
|
|
2676
|
84
|
100
|
|
|
|
|
for (i = 0; i < blen; i++) |
2677
|
80
|
50
|
|
|
|
|
if (!isDIGIT(b[i])) |
2678
|
0
|
|
|
|
|
|
break; |
2679
|
4
|
50
|
|
|
|
|
if (blen == 0 || i < blen) |
|
|
50
|
|
|
|
|
|
2680
|
0
|
|
|
|
|
|
croak("Parameter must be a positive integer"); |
2681
|
|
|
|
|
|
|
|
2682
|
4
|
100
|
|
|
|
|
if (a == 0) return 1; |
2683
|
|
|
|
|
|
|
|
2684
|
2
|
|
|
|
|
|
aneg = (a[0] == '-'); |
2685
|
2
|
50
|
|
|
|
|
if (a[0] == '-' || a[0] == '+') { a++; alen--; } |
|
|
50
|
|
|
|
|
|
2686
|
2
|
50
|
|
|
|
|
while (alen > 0 && *a == '0') { a++; alen--; } |
|
|
50
|
|
|
|
|
|
2687
|
|
|
|
|
|
|
|
2688
|
2
|
50
|
|
|
|
|
if (aneg != bneg) return min ? (bneg == 1) : (aneg == 1); |
|
|
0
|
|
|
|
|
|
2689
|
2
|
50
|
|
|
|
|
if (aneg == 1) min = !min; |
2690
|
2
|
50
|
|
|
|
|
if (alen != blen) return min ? (alen > blen) : (blen > alen); |
|
|
0
|
|
|
|
|
|
2691
|
|
|
|
|
|
|
|
2692
|
2
|
50
|
|
|
|
|
for (i = 0; i < blen; i++) |
2693
|
2
|
50
|
|
|
|
|
if (a[i] != b[i]) |
2694
|
2
|
100
|
|
|
|
|
return min ? (a[i] > b[i]) : (b[i] > a[i]); |
2695
|
0
|
|
|
|
|
|
return 0; /* equal */ |
2696
|
|
|
|
|
|
|
} |
2697
|
|
|
|
|
|
|
|
2698
|
6
|
|
|
|
|
|
int from_digit_string(UV* rn, const char* s, int base) |
2699
|
|
|
|
|
|
|
{ |
2700
|
6
|
|
|
|
|
|
UV max, n = 0; |
2701
|
|
|
|
|
|
|
int i, len; |
2702
|
|
|
|
|
|
|
|
2703
|
|
|
|
|
|
|
/* Skip leading -/+ and zeros */ |
2704
|
6
|
50
|
|
|
|
|
if (s[0] == '-' || s[0] == '+') s++; |
|
|
50
|
|
|
|
|
|
2705
|
6
|
50
|
|
|
|
|
while (s[0] == '0') s++; |
2706
|
|
|
|
|
|
|
|
2707
|
6
|
|
|
|
|
|
len = strlen(s); |
2708
|
6
|
|
|
|
|
|
max = (UV_MAX-base+1)/base; |
2709
|
|
|
|
|
|
|
|
2710
|
39
|
100
|
|
|
|
|
for (i = 0, len = strlen(s); i < len; i++) { |
2711
|
34
|
|
|
|
|
|
const char c = s[i]; |
2712
|
34
|
50
|
|
|
|
|
int d = !isalnum(c) ? 255 : (c <= '9') ? c-'0' : (c <= 'Z') ? c-'A'+10 : c-'a'+10; |
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
2713
|
34
|
50
|
|
|
|
|
if (d >= base) croak("Invalid digit for base %d", base); |
2714
|
34
|
100
|
|
|
|
|
if (n > max) return 0; /* Overflow */ |
2715
|
33
|
|
|
|
|
|
n = n * base + d; |
2716
|
|
|
|
|
|
|
} |
2717
|
5
|
|
|
|
|
|
*rn = n; |
2718
|
5
|
|
|
|
|
|
return 1; |
2719
|
|
|
|
|
|
|
} |
2720
|
|
|
|
|
|
|
|
2721
|
13
|
|
|
|
|
|
int from_digit_to_UV(UV* rn, UV* r, int len, int base) |
2722
|
|
|
|
|
|
|
{ |
2723
|
13
|
|
|
|
|
|
UV d, n = 0; |
2724
|
|
|
|
|
|
|
int i; |
2725
|
13
|
50
|
|
|
|
|
if (len < 0 || len > BITS_PER_WORD) |
|
|
50
|
|
|
|
|
|
2726
|
0
|
|
|
|
|
|
return 0; |
2727
|
76
|
100
|
|
|
|
|
for (i = 0; i < len; i++) { |
2728
|
63
|
|
|
|
|
|
d = r[i]; |
2729
|
63
|
50
|
|
|
|
|
if (n > (UV_MAX-d)/base) break; /* overflow */ |
2730
|
63
|
|
|
|
|
|
n = n * base + d; |
2731
|
|
|
|
|
|
|
} |
2732
|
13
|
|
|
|
|
|
*rn = n; |
2733
|
13
|
|
|
|
|
|
return (i >= len); |
2734
|
|
|
|
|
|
|
} |
2735
|
|
|
|
|
|
|
|
2736
|
|
|
|
|
|
|
|
2737
|
0
|
|
|
|
|
|
int from_digit_to_str(char** rstr, UV* r, int len, int base) |
2738
|
|
|
|
|
|
|
{ |
2739
|
|
|
|
|
|
|
char *so, *s; |
2740
|
|
|
|
|
|
|
int i; |
2741
|
|
|
|
|
|
|
|
2742
|
0
|
0
|
|
|
|
|
if (len < 0 || !(base == 2 || base == 10 || base == 16)) return 0; |
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
2743
|
|
|
|
|
|
|
|
2744
|
0
|
0
|
|
|
|
|
if (r[0] >= (UV) base) return 0; /* TODO: We don't apply extended carry */ |
2745
|
|
|
|
|
|
|
|
2746
|
0
|
|
|
|
|
|
New(0, so, len + 3, char); |
2747
|
0
|
|
|
|
|
|
s = so; |
2748
|
0
|
0
|
|
|
|
|
if (base == 2 || base == 16) { |
|
|
0
|
|
|
|
|
|
2749
|
0
|
|
|
|
|
|
*s++ = '0'; |
2750
|
0
|
0
|
|
|
|
|
*s++ = (base == 2) ? 'b' : 'x'; |
2751
|
|
|
|
|
|
|
} |
2752
|
0
|
0
|
|
|
|
|
for (i = 0; i < len; i++) { |
2753
|
0
|
|
|
|
|
|
UV d = r[i]; |
2754
|
0
|
0
|
|
|
|
|
s[i] = (d < 10) ? '0'+d : 'a'+d-10; |
2755
|
|
|
|
|
|
|
} |
2756
|
0
|
|
|
|
|
|
s[len] = '\0'; |
2757
|
0
|
|
|
|
|
|
*rstr = so; |
2758
|
0
|
|
|
|
|
|
return 1; |
2759
|
|
|
|
|
|
|
} |
2760
|
|
|
|
|
|
|
|
2761
|
17
|
|
|
|
|
|
int to_digit_array(int* bits, UV n, int base, int length) |
2762
|
|
|
|
|
|
|
{ |
2763
|
|
|
|
|
|
|
int d; |
2764
|
|
|
|
|
|
|
|
2765
|
17
|
50
|
|
|
|
|
if (base < 2 || length > 128) return -1; |
|
|
50
|
|
|
|
|
|
2766
|
|
|
|
|
|
|
|
2767
|
17
|
100
|
|
|
|
|
if (base == 2) { |
2768
|
87
|
100
|
|
|
|
|
for (d = 0; n; n >>= 1) |
2769
|
77
|
|
|
|
|
|
bits[d++] = n & 1; |
2770
|
|
|
|
|
|
|
} else { |
2771
|
31
|
100
|
|
|
|
|
for (d = 0; n; n /= base) |
2772
|
24
|
|
|
|
|
|
bits[d++] = n % base; |
2773
|
|
|
|
|
|
|
} |
2774
|
17
|
100
|
|
|
|
|
if (length < 0) length = d; |
2775
|
43
|
100
|
|
|
|
|
while (d < length) |
2776
|
26
|
|
|
|
|
|
bits[d++] = 0; |
2777
|
17
|
|
|
|
|
|
return length; |
2778
|
|
|
|
|
|
|
} |
2779
|
|
|
|
|
|
|
|
2780
|
3
|
|
|
|
|
|
int to_digit_string(char* s, UV n, int base, int length) |
2781
|
|
|
|
|
|
|
{ |
2782
|
|
|
|
|
|
|
int digits[128]; |
2783
|
3
|
|
|
|
|
|
int i, len = to_digit_array(digits, n, base, length); |
2784
|
|
|
|
|
|
|
|
2785
|
3
|
50
|
|
|
|
|
if (len < 0) return -1; |
2786
|
3
|
50
|
|
|
|
|
if (base > 36) croak("invalid base for string: %d", base); |
2787
|
|
|
|
|
|
|
|
2788
|
21
|
100
|
|
|
|
|
for (i = 0; i < len; i++) { |
2789
|
18
|
|
|
|
|
|
int dig = digits[len-i-1]; |
2790
|
18
|
50
|
|
|
|
|
s[i] = (dig < 10) ? '0'+dig : 'a'+dig-10; |
2791
|
|
|
|
|
|
|
} |
2792
|
3
|
|
|
|
|
|
s[len] = '\0'; |
2793
|
3
|
|
|
|
|
|
return len; |
2794
|
|
|
|
|
|
|
} |
2795
|
|
|
|
|
|
|
|
2796
|
1
|
|
|
|
|
|
int to_string_128(char str[40], IV hi, UV lo) |
2797
|
|
|
|
|
|
|
{ |
2798
|
1
|
|
|
|
|
|
int i, slen = 0, isneg = 0; |
2799
|
|
|
|
|
|
|
|
2800
|
1
|
50
|
|
|
|
|
if (hi < 0) { |
2801
|
0
|
|
|
|
|
|
isneg = 1; |
2802
|
0
|
|
|
|
|
|
hi = -(hi+1); |
2803
|
0
|
|
|
|
|
|
lo = UV_MAX - lo + 1; |
2804
|
|
|
|
|
|
|
} |
2805
|
|
|
|
|
|
|
#if BITS_PER_WORD == 64 && HAVE_UINT128 |
2806
|
|
|
|
|
|
|
{ |
2807
|
1
|
|
|
|
|
|
uint128_t dd, sum = (((uint128_t) hi) << 64) + lo; |
2808
|
|
|
|
|
|
|
do { |
2809
|
20
|
|
|
|
|
|
dd = sum / 10; |
2810
|
20
|
|
|
|
|
|
str[slen++] = '0' + (sum - dd*10); |
2811
|
20
|
|
|
|
|
|
sum = dd; |
2812
|
20
|
100
|
|
|
|
|
} while (sum); |
2813
|
|
|
|
|
|
|
} |
2814
|
|
|
|
|
|
|
#else |
2815
|
|
|
|
|
|
|
{ |
2816
|
|
|
|
|
|
|
UV d, r; |
2817
|
|
|
|
|
|
|
uint32_t a[4]; |
2818
|
|
|
|
|
|
|
a[0] = hi >> (BITS_PER_WORD/2); |
2819
|
|
|
|
|
|
|
a[1] = hi & (UV_MAX >> (BITS_PER_WORD/2)); |
2820
|
|
|
|
|
|
|
a[2] = lo >> (BITS_PER_WORD/2); |
2821
|
|
|
|
|
|
|
a[3] = lo & (UV_MAX >> (BITS_PER_WORD/2)); |
2822
|
|
|
|
|
|
|
do { |
2823
|
|
|
|
|
|
|
r = a[0]; |
2824
|
|
|
|
|
|
|
d = r/10; r = ((r-d*10) << (BITS_PER_WORD/2)) + a[1]; a[0] = d; |
2825
|
|
|
|
|
|
|
d = r/10; r = ((r-d*10) << (BITS_PER_WORD/2)) + a[2]; a[1] = d; |
2826
|
|
|
|
|
|
|
d = r/10; r = ((r-d*10) << (BITS_PER_WORD/2)) + a[3]; a[2] = d; |
2827
|
|
|
|
|
|
|
d = r/10; r = r-d*10; a[3] = d; |
2828
|
|
|
|
|
|
|
str[slen++] = '0'+(r%10); |
2829
|
|
|
|
|
|
|
} while (a[0] || a[1] || a[2] || a[3]); |
2830
|
|
|
|
|
|
|
} |
2831
|
|
|
|
|
|
|
#endif |
2832
|
|
|
|
|
|
|
/* Reverse the order */ |
2833
|
11
|
100
|
|
|
|
|
for (i=0; i < slen/2; i++) { |
2834
|
10
|
|
|
|
|
|
char t=str[i]; |
2835
|
10
|
|
|
|
|
|
str[i]=str[slen-i-1]; |
2836
|
10
|
|
|
|
|
|
str[slen-i-1] = t; |
2837
|
|
|
|
|
|
|
} |
2838
|
|
|
|
|
|
|
/* Prepend a negative sign if needed */ |
2839
|
1
|
50
|
|
|
|
|
if (isneg) { |
2840
|
0
|
0
|
|
|
|
|
for (i = slen; i > 0; i--) |
2841
|
0
|
|
|
|
|
|
str[i] = str[i-1]; |
2842
|
0
|
|
|
|
|
|
str[0] = '-'; |
2843
|
0
|
|
|
|
|
|
slen++; |
2844
|
|
|
|
|
|
|
} |
2845
|
|
|
|
|
|
|
/* Add terminator */ |
2846
|
1
|
|
|
|
|
|
str[slen] = '\0'; |
2847
|
1
|
|
|
|
|
|
return slen; |
2848
|
|
|
|
|
|
|
} |
2849
|
|
|
|
|
|
|
|
2850
|
|
|
|
|
|
|
/* Oddball primality test. |
2851
|
|
|
|
|
|
|
* In this file rather than primality.c because it uses factoring (!). |
2852
|
|
|
|
|
|
|
* Algorithm from Charles R Greathouse IV, 2015 */ |
2853
|
472642
|
|
|
|
|
|
static INLINE uint32_t _catalan_v32(uint32_t n, uint32_t p) { |
2854
|
472642
|
|
|
|
|
|
uint32_t s = 0; |
2855
|
946183
|
100
|
|
|
|
|
while (n /= p) s += n % 2; |
2856
|
472642
|
|
|
|
|
|
return s; |
2857
|
|
|
|
|
|
|
} |
2858
|
0
|
|
|
|
|
|
static INLINE uint32_t _catalan_v(UV n, UV p) { |
2859
|
0
|
|
|
|
|
|
uint32_t s = 0; |
2860
|
0
|
0
|
|
|
|
|
while (n /= p) s += n % 2; |
2861
|
0
|
|
|
|
|
|
return s; |
2862
|
|
|
|
|
|
|
} |
2863
|
901451
|
|
|
|
|
|
static UV _catalan_mult(UV m, UV p, UV n, UV a) { |
2864
|
901451
|
100
|
|
|
|
|
if (p > a) { |
2865
|
428809
|
|
|
|
|
|
m = mulmod(m, p, n); |
2866
|
|
|
|
|
|
|
} else { |
2867
|
472642
|
50
|
|
|
|
|
UV pow = (n <= 4294967295UL) ? _catalan_v32(a<<1,p) : _catalan_v(a<<1,p); |
2868
|
472642
|
|
|
|
|
|
m = (pow == 0) ? m |
2869
|
658853
|
100
|
|
|
|
|
: (pow == 1) ? mulmod(m,p,n) |
2870
|
186211
|
100
|
|
|
|
|
: mulmod(m,powmod(p,pow,n),n); |
2871
|
|
|
|
|
|
|
} |
2872
|
901451
|
|
|
|
|
|
return m; |
2873
|
|
|
|
|
|
|
} |
2874
|
5
|
|
|
|
|
|
static int _catalan_vtest(UV n, UV p) { |
2875
|
18
|
100
|
|
|
|
|
while (n /= p) |
2876
|
13
|
50
|
|
|
|
|
if (n % 2) |
2877
|
0
|
|
|
|
|
|
return 1; |
2878
|
5
|
|
|
|
|
|
return 0; |
2879
|
|
|
|
|
|
|
} |
2880
|
3
|
|
|
|
|
|
int is_catalan_pseudoprime(UV n) { |
2881
|
|
|
|
|
|
|
UV m, a; |
2882
|
|
|
|
|
|
|
int i; |
2883
|
|
|
|
|
|
|
|
2884
|
3
|
50
|
|
|
|
|
if (n < 2 || ((n % 2) == 0 && n != 2)) return 0; |
|
|
50
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
2885
|
3
|
50
|
|
|
|
|
if (is_prob_prime(n)) return 1; |
2886
|
|
|
|
|
|
|
|
2887
|
3
|
|
|
|
|
|
m = 1; |
2888
|
3
|
|
|
|
|
|
a = n >> 1; |
2889
|
|
|
|
|
|
|
/* |
2890
|
|
|
|
|
|
|
* Ideally we could use some of the requirements for a mod 4/8/64 here: |
2891
|
|
|
|
|
|
|
* http://www.combinatorics.net/conf/Z60/sp/sp/Shu-Chung%20Liu.pdf |
2892
|
|
|
|
|
|
|
* But, how do we make +/-2 = X mod n into a solution for x = X mod 8? |
2893
|
|
|
|
|
|
|
* |
2894
|
|
|
|
|
|
|
* We could also exploit the exhaustive testing that shows there only |
2895
|
|
|
|
|
|
|
* exist three below 1e10: 5907, 1194649, and 12327121. |
2896
|
|
|
|
|
|
|
*/ |
2897
|
|
|
|
|
|
|
{ |
2898
|
|
|
|
|
|
|
UV factors[MPU_MAX_FACTORS+1]; |
2899
|
3
|
|
|
|
|
|
int nfactors = factor_exp(n, factors, 0); |
2900
|
|
|
|
|
|
|
#if BITS_PER_WORD == 32 |
2901
|
|
|
|
|
|
|
if (nfactors == 2) return 0; /* Page 9, all 32-bit semiprimes */ |
2902
|
|
|
|
|
|
|
#else |
2903
|
3
|
50
|
|
|
|
|
if (nfactors == 2) { /* Conditions from Aebi and Cairns (2008) */ |
2904
|
0
|
0
|
|
|
|
|
if (n < UVCONST(10000000000)) return 0; /* Page 9 */ |
2905
|
0
|
0
|
|
|
|
|
if (2*factors[0]+1 >= factors[1]) return 0; /* Corollary 2 and 3 */ |
2906
|
|
|
|
|
|
|
} |
2907
|
|
|
|
|
|
|
#endif |
2908
|
|
|
|
|
|
|
/* Test every factor */ |
2909
|
8
|
100
|
|
|
|
|
for (i = 0; i < nfactors; i++) { |
2910
|
5
|
50
|
|
|
|
|
if (_catalan_vtest(a << 1, factors[i])) |
2911
|
0
|
|
|
|
|
|
return 0; |
2912
|
|
|
|
|
|
|
} |
2913
|
|
|
|
|
|
|
} |
2914
|
|
|
|
|
|
|
{ |
2915
|
|
|
|
|
|
|
UV seg_base, seg_low, seg_high; |
2916
|
|
|
|
|
|
|
unsigned char* segment; |
2917
|
|
|
|
|
|
|
void* ctx; |
2918
|
3
|
|
|
|
|
|
m = _catalan_mult(m, 2, n, a); |
2919
|
3
|
|
|
|
|
|
m = _catalan_mult(m, 3, n, a); |
2920
|
3
|
|
|
|
|
|
m = _catalan_mult(m, 5, n, a); |
2921
|
3
|
|
|
|
|
|
ctx = start_segment_primes(7, n, &segment); |
2922
|
19
|
100
|
|
|
|
|
while (next_segment_primes(ctx, &seg_base, &seg_low, &seg_high)) { |
2923
|
957825
|
50
|
|
|
|
|
START_DO_FOR_EACH_SIEVE_PRIME( segment, seg_base, seg_low, seg_high ) { |
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
2924
|
901442
|
|
|
|
|
|
m = _catalan_mult(m, p, n, a); |
2925
|
56367
|
|
|
|
|
|
} END_DO_FOR_EACH_SIEVE_PRIME |
2926
|
|
|
|
|
|
|
} |
2927
|
3
|
|
|
|
|
|
end_segment_primes(ctx); |
2928
|
|
|
|
|
|
|
} |
2929
|
3
|
100
|
|
|
|
|
return (a & 1) ? (m==(n-1)) : (m==1); |
2930
|
|
|
|
|
|
|
} |
2931
|
|
|
|
|
|
|
|
2932
|
|
|
|
|
|
|
/* If we have fast CTZ, use this GCD. See Brent Alg V and FLINT Abhinav Baid */ |
2933
|
35602
|
|
|
|
|
|
UV gcdz(UV x, UV y) { |
2934
|
|
|
|
|
|
|
UV f, x2, y2; |
2935
|
|
|
|
|
|
|
|
2936
|
35602
|
100
|
|
|
|
|
if (x == 0) return y; |
2937
|
|
|
|
|
|
|
|
2938
|
35592
|
100
|
|
|
|
|
if (y & 1) { /* Optimize y odd */ |
2939
|
19773
|
50
|
|
|
|
|
x >>= ctz(x); |
2940
|
390518
|
100
|
|
|
|
|
while (x != y) { |
2941
|
370745
|
100
|
|
|
|
|
if (x < y) { y -= x; y >>= ctz(y); } |
|
|
50
|
|
|
|
|
|
2942
|
318953
|
50
|
|
|
|
|
else { x -= y; x >>= ctz(x); } |
2943
|
|
|
|
|
|
|
} |
2944
|
19773
|
|
|
|
|
|
return x; |
2945
|
|
|
|
|
|
|
} |
2946
|
|
|
|
|
|
|
|
2947
|
15819
|
100
|
|
|
|
|
if (y == 0) return x; |
2948
|
|
|
|
|
|
|
|
2949
|
|
|
|
|
|
|
/* Alternately: f = ctz(x|y); x >>= ctz(x); y >>= ctz(y); */ |
2950
|
15818
|
50
|
|
|
|
|
x2 = ctz(x); |
2951
|
15818
|
50
|
|
|
|
|
y2 = ctz(y); |
2952
|
15818
|
|
|
|
|
|
f = (x2 <= y2) ? x2 : y2; |
2953
|
15818
|
|
|
|
|
|
x >>= x2; |
2954
|
15818
|
|
|
|
|
|
y >>= y2; |
2955
|
|
|
|
|
|
|
|
2956
|
203676
|
100
|
|
|
|
|
while (x != y) { |
2957
|
187858
|
100
|
|
|
|
|
if (x < y) { |
2958
|
14906
|
|
|
|
|
|
y -= x; |
2959
|
14906
|
50
|
|
|
|
|
y >>= ctz(y); |
2960
|
|
|
|
|
|
|
} else { |
2961
|
172952
|
|
|
|
|
|
x -= y; |
2962
|
172952
|
50
|
|
|
|
|
x >>= ctz(x); |
2963
|
|
|
|
|
|
|
} |
2964
|
|
|
|
|
|
|
} |
2965
|
15818
|
|
|
|
|
|
return x << f; |
2966
|
|
|
|
|
|
|
} |
2967
|
|
|
|
|
|
|
|
2968
|
|
|
|
|
|
|
/* The intermediate values are so large that we can only stay in 64-bit |
2969
|
|
|
|
|
|
|
* up to 53 or so using the divisor_sum calculations. So just use a table. |
2970
|
|
|
|
|
|
|
* Save space by just storing the 32-bit values. */ |
2971
|
|
|
|
|
|
|
static const int32_t tau_table[] = { |
2972
|
|
|
|
|
|
|
0,1,-24,252,-1472,4830,-6048,-16744,84480,-113643,-115920,534612,-370944,-577738,401856,1217160,987136,-6905934,2727432,10661420,-7109760,-4219488,-12830688,18643272,21288960,-25499225,13865712,-73279080,24647168,128406630,-29211840,-52843168,-196706304,134722224,165742416,-80873520,167282496,-182213314,-255874080,-145589976,408038400,308120442,101267712,-17125708,-786948864,-548895690,-447438528 |
2973
|
|
|
|
|
|
|
}; |
2974
|
|
|
|
|
|
|
#define NTAU (sizeof(tau_table)/sizeof(tau_table[0])) |
2975
|
10
|
|
|
|
|
|
IV ramanujan_tau(UV n) { |
2976
|
10
|
100
|
|
|
|
|
return (n < NTAU) ? tau_table[n] : 0; |
2977
|
|
|
|
|
|
|
} |
2978
|
|
|
|
|
|
|
|
2979
|
405
|
|
|
|
|
|
static UV _count_class_div(UV s, UV b2) { |
2980
|
405
|
|
|
|
|
|
UV h = 0, i, ndivisors, *divs, lim; |
2981
|
|
|
|
|
|
|
|
2982
|
405
|
|
|
|
|
|
lim = isqrt(b2); |
2983
|
405
|
100
|
|
|
|
|
if (lim*lim == b2) lim--; |
2984
|
405
|
100
|
|
|
|
|
if (s > lim) return 0; |
2985
|
|
|
|
|
|
|
|
2986
|
362
|
100
|
|
|
|
|
if ((lim-s) < 70) { /* Iterate looking for divisors */ |
2987
|
7104
|
100
|
|
|
|
|
for (i = s; i <= lim; i++) |
2988
|
6767
|
100
|
|
|
|
|
if (b2 % i == 0) |
2989
|
106
|
|
|
|
|
|
h++; |
2990
|
|
|
|
|
|
|
} else { /* Walk through all the divisors */ |
2991
|
25
|
|
|
|
|
|
divs = _divisor_list(b2, &ndivisors); |
2992
|
56
|
50
|
|
|
|
|
for (i = 0; i < ndivisors && divs[i] <= lim; i++) |
|
|
100
|
|
|
|
|
|
2993
|
31
|
100
|
|
|
|
|
if (divs[i] >= s) |
2994
|
6
|
|
|
|
|
|
h++; |
2995
|
25
|
|
|
|
|
|
Safefree(divs); |
2996
|
|
|
|
|
|
|
} |
2997
|
405
|
|
|
|
|
|
return h; |
2998
|
|
|
|
|
|
|
} |
2999
|
|
|
|
|
|
|
|
3000
|
|
|
|
|
|
|
/* Returns 12 * H(n). See Cohen 5.3.5 or Pari/GP. |
3001
|
|
|
|
|
|
|
* Pari/GP uses a different method for n > 500000, which is quite a bit |
3002
|
|
|
|
|
|
|
* faster, but assumes the GRH. */ |
3003
|
96
|
|
|
|
|
|
IV hclassno(UV n) { |
3004
|
96
|
|
|
|
|
|
UV nmod4 = n % 4, b2, b, h; |
3005
|
|
|
|
|
|
|
int square; |
3006
|
|
|
|
|
|
|
|
3007
|
96
|
100
|
|
|
|
|
if (n == 0) return -1; |
3008
|
95
|
100
|
|
|
|
|
if (nmod4 == 1 || nmod4 == 2) return 0; |
|
|
100
|
|
|
|
|
|
3009
|
74
|
100
|
|
|
|
|
if (n == 3) return 4; |
3010
|
|
|
|
|
|
|
|
3011
|
73
|
|
|
|
|
|
b = n & 1; |
3012
|
73
|
|
|
|
|
|
b2 = (n+1) >> 2; |
3013
|
73
|
|
|
|
|
|
square = is_perfect_square(b2); |
3014
|
|
|
|
|
|
|
|
3015
|
73
|
|
|
|
|
|
h = divisor_sum(b2,0) >> 1; |
3016
|
73
|
100
|
|
|
|
|
if (b == 1) |
3017
|
18
|
|
|
|
|
|
h = 1 + square + ((h - 1) << 1); |
3018
|
73
|
|
|
|
|
|
b += 2; |
3019
|
|
|
|
|
|
|
|
3020
|
478
|
100
|
|
|
|
|
for (; b2 = (n + b*b) >> 2, 3*b2 < n; b += 2) { |
3021
|
810
|
|
|
|
|
|
h += (b2 % b == 0) |
3022
|
405
|
|
|
|
|
|
+ is_perfect_square(b2) |
3023
|
405
|
|
|
|
|
|
+ (_count_class_div(b+1, b2) << 1); |
3024
|
|
|
|
|
|
|
} |
3025
|
73
|
100
|
|
|
|
|
return 12*h + ((b2*3 == n) ? 4 : square && !(n&1) ? 6 : 0); |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
3026
|
|
|
|
|
|
|
} |
3027
|
|
|
|
|
|
|
|
3028
|
25300
|
|
|
|
|
|
UV polygonal_root(UV n, UV k, int* overflow) { |
3029
|
|
|
|
|
|
|
UV D, R; |
3030
|
25300
|
50
|
|
|
|
|
MPUassert(k >= 3, "is_polygonal root < 3"); |
3031
|
25300
|
|
|
|
|
|
*overflow = 0; |
3032
|
25300
|
100
|
|
|
|
|
if (n <= 1) return n; |
3033
|
25254
|
100
|
|
|
|
|
if (k == 4) return is_perfect_square(n) ? isqrt(n) : 0; |
|
|
100
|
|
|
|
|
|
3034
|
25056
|
100
|
|
|
|
|
if (k == 3) { |
3035
|
108
|
50
|
|
|
|
|
if (n >= UV_MAX/8) *overflow = 1; |
3036
|
108
|
|
|
|
|
|
D = n << 3; |
3037
|
108
|
|
|
|
|
|
R = 1; |
3038
|
|
|
|
|
|
|
} else { |
3039
|
24948
|
50
|
|
|
|
|
if (k > UV_MAX/k || n > UV_MAX/(8*k-16)) *overflow = 1; |
|
|
50
|
|
|
|
|
|
3040
|
24948
|
|
|
|
|
|
D = (8*k-16) * n; |
3041
|
24948
|
|
|
|
|
|
R = (k-4) * (k-4); |
3042
|
|
|
|
|
|
|
} |
3043
|
25056
|
50
|
|
|
|
|
if (D+R <= D) *overflow = 1; |
3044
|
25056
|
|
|
|
|
|
D += R; |
3045
|
25056
|
50
|
|
|
|
|
if (*overflow || !is_perfect_square(D)) return 0; |
|
|
100
|
|
|
|
|
|
3046
|
918
|
|
|
|
|
|
D = isqrt(D) + (k-4); |
3047
|
918
|
|
|
|
|
|
R = 2*k - 4; |
3048
|
918
|
100
|
|
|
|
|
if ((D % R) != 0) return 0; |
3049
|
396
|
|
|
|
|
|
return D/R; |
3050
|
|
|
|
|
|
|
} |
3051
|
|
|
|
|
|
|
|
3052
|
|
|
|
|
|
|
/* These rank/unrank are O(n^2) algorithms using O(n) in-place space. |
3053
|
|
|
|
|
|
|
* Bonet 2008 gives O(n log n) algorithms using a bit more space. |
3054
|
|
|
|
|
|
|
*/ |
3055
|
|
|
|
|
|
|
|
3056
|
5
|
|
|
|
|
|
int num_to_perm(UV k, int n, int *vec) { |
3057
|
5
|
|
|
|
|
|
int i, j, t, si = 0; |
3058
|
5
|
|
|
|
|
|
UV f = factorial(n-1); |
3059
|
|
|
|
|
|
|
|
3060
|
8
|
100
|
|
|
|
|
while (f == 0) /* We can handle n! overflow if we have a valid k */ |
3061
|
3
|
|
|
|
|
|
f = factorial(n - 1 - ++si); |
3062
|
|
|
|
|
|
|
|
3063
|
5
|
100
|
|
|
|
|
if (k/f >= (UV)n) |
3064
|
1
|
|
|
|
|
|
k %= f*n; |
3065
|
|
|
|
|
|
|
|
3066
|
50
|
100
|
|
|
|
|
for (i = 0; i < n; i++) |
3067
|
45
|
|
|
|
|
|
vec[i] = i; |
3068
|
42
|
100
|
|
|
|
|
for (i = si; i < n-1; i++) { |
3069
|
37
|
|
|
|
|
|
UV p = k/f; |
3070
|
37
|
|
|
|
|
|
k -= p*f; |
3071
|
37
|
|
|
|
|
|
f /= n-i-1; |
3072
|
37
|
100
|
|
|
|
|
if (p > 0) { |
3073
|
66
|
100
|
|
|
|
|
for (j = i+p, t = vec[j]; j > i; j--) |
3074
|
47
|
|
|
|
|
|
vec[j] = vec[j-1]; |
3075
|
19
|
|
|
|
|
|
vec[i] = t; |
3076
|
|
|
|
|
|
|
} |
3077
|
|
|
|
|
|
|
} |
3078
|
5
|
|
|
|
|
|
return 1; |
3079
|
|
|
|
|
|
|
} |
3080
|
|
|
|
|
|
|
|
3081
|
6
|
|
|
|
|
|
int perm_to_num(int n, int *vec, UV *rank) { |
3082
|
|
|
|
|
|
|
int i, j, k; |
3083
|
6
|
|
|
|
|
|
UV f, num = 0; |
3084
|
6
|
|
|
|
|
|
f = factorial(n-1); |
3085
|
6
|
100
|
|
|
|
|
if (f == 0) return 0; |
3086
|
42
|
100
|
|
|
|
|
for (i = 0; i < n-1; i++) { |
3087
|
340
|
100
|
|
|
|
|
for (j = i+1, k = 0; j < n; j++) |
3088
|
302
|
100
|
|
|
|
|
if (vec[j] < vec[i]) |
3089
|
137
|
|
|
|
|
|
k++; |
3090
|
38
|
50
|
|
|
|
|
if ((UV)k > (UV_MAX-num)/f) return 0; /* overflow */ |
3091
|
38
|
|
|
|
|
|
num += k*f; |
3092
|
38
|
|
|
|
|
|
f /= n-i-1; |
3093
|
|
|
|
|
|
|
} |
3094
|
4
|
|
|
|
|
|
*rank = num; |
3095
|
4
|
|
|
|
|
|
return 1; |
3096
|
|
|
|
|
|
|
} |
3097
|
|
|
|
|
|
|
|
3098
|
|
|
|
|
|
|
/* |
3099
|
|
|
|
|
|
|
* For k
|
3100
|
|
|
|
|
|
|
* https://www.math.upenn.edu/~wilf/website/CombinatorialAlgorithms.pdf |
3101
|
|
|
|
|
|
|
* Note it requires an O(k) complete shuffle as the results are sorted. |
3102
|
|
|
|
|
|
|
* |
3103
|
|
|
|
|
|
|
* This seems to be 4-100x faster than NumPy's random.{permutation,choice} |
3104
|
|
|
|
|
|
|
* for n under 100k or so. It's even faster with larger n. For example |
3105
|
|
|
|
|
|
|
* from numpy.random import choice; choice(100000000, 4, replace=False) |
3106
|
|
|
|
|
|
|
* uses 774MB and takes 55 seconds. We take less than 1 microsecond. |
3107
|
|
|
|
|
|
|
*/ |
3108
|
3
|
|
|
|
|
|
void randperm(void* ctx, UV n, UV k, UV *S) { |
3109
|
|
|
|
|
|
|
UV i, j; |
3110
|
|
|
|
|
|
|
|
3111
|
3
|
50
|
|
|
|
|
if (k > n) k = n; |
3112
|
|
|
|
|
|
|
|
3113
|
3
|
50
|
|
|
|
|
if (k == 0) { /* 0 of n */ |
3114
|
3
|
100
|
|
|
|
|
} else if (k == 1) { /* 1 of n. Pick one at random */ |
3115
|
1
|
|
|
|
|
|
S[0] = urandomm64(ctx,n); |
3116
|
2
|
50
|
|
|
|
|
} else if (k == 2 && n == 2) { /* 2 of 2. Flip a coin */ |
|
|
0
|
|
|
|
|
|
3117
|
0
|
|
|
|
|
|
S[0] = urandomb(ctx,1); |
3118
|
0
|
|
|
|
|
|
S[1] = 1-S[0]; |
3119
|
2
|
50
|
|
|
|
|
} else if (k == 2) { /* 2 of n. Pick 2 skipping dup */ |
3120
|
0
|
|
|
|
|
|
S[0] = urandomm64(ctx,n); |
3121
|
0
|
|
|
|
|
|
S[1] = urandomm64(ctx,n-1); |
3122
|
0
|
0
|
|
|
|
|
if (S[1] >= S[0]) S[1]++; |
3123
|
2
|
50
|
|
|
|
|
} else if (k < n/100 && k < 30) { /* k of n. Pick k with loop */ |
|
|
0
|
|
|
|
|
|
3124
|
0
|
0
|
|
|
|
|
for (i = 0; i < k; i++) { |
3125
|
|
|
|
|
|
|
do { |
3126
|
0
|
|
|
|
|
|
S[i] = urandomm64(ctx,n); |
3127
|
0
|
0
|
|
|
|
|
for (j = 0; j < i; j++) |
3128
|
0
|
0
|
|
|
|
|
if (S[j] == S[i]) |
3129
|
0
|
|
|
|
|
|
break; |
3130
|
0
|
0
|
|
|
|
|
} while (j < i); |
3131
|
|
|
|
|
|
|
} |
3132
|
2
|
50
|
|
|
|
|
} else if (k < n/100 && n > 1000000) {/* k of n. Pick k with dedup retry */ |
|
|
0
|
|
|
|
|
|
3133
|
0
|
0
|
|
|
|
|
for (j = 0; j < k; ) { |
3134
|
0
|
0
|
|
|
|
|
for (i = j; i < k; i++) /* Fill S[j .. k-1] then sort S */ |
3135
|
0
|
|
|
|
|
|
S[i] = urandomm64(ctx,n); |
3136
|
0
|
|
|
|
|
|
qsort(S, k, sizeof(UV), _numcmp); |
3137
|
0
|
0
|
|
|
|
|
for (j = 0, i = 1; i < k; i++) /* Find and remove dups. O(n). */ |
3138
|
0
|
0
|
|
|
|
|
if (S[j] != S[i]) |
3139
|
0
|
|
|
|
|
|
S[++j] = S[i]; |
3140
|
0
|
|
|
|
|
|
j++; |
3141
|
|
|
|
|
|
|
} |
3142
|
|
|
|
|
|
|
/* S is sorted unique k-selection of 0 to n-1. Shuffle. */ |
3143
|
0
|
0
|
|
|
|
|
for (i = 0; i < k; i++) { |
3144
|
0
|
|
|
|
|
|
j = urandomm64(ctx,k-i); |
3145
|
0
|
|
|
|
|
|
{ UV t = S[i]; S[i] = S[i+j]; S[i+j] = t; } |
3146
|
|
|
|
|
|
|
} |
3147
|
2
|
100
|
|
|
|
|
} else if (k < n/4) { /* k of n. Pick k with mask */ |
3148
|
1
|
|
|
|
|
|
uint32_t *mask, smask[8] = {0}; |
3149
|
1
|
50
|
|
|
|
|
if (n <= 32*8) mask = smask; |
3150
|
0
|
0
|
|
|
|
|
else Newz(0, mask, n/32 + ((n%32)?1:0), uint32_t); |
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
3151
|
5
|
100
|
|
|
|
|
for (i = 0; i < k; i++) { |
3152
|
|
|
|
|
|
|
do { |
3153
|
4
|
|
|
|
|
|
j = urandomm64(ctx,n); |
3154
|
4
|
50
|
|
|
|
|
} while ( mask[j>>5] & (1U << (j&0x1F)) ); |
3155
|
4
|
|
|
|
|
|
S[i] = j; |
3156
|
4
|
|
|
|
|
|
mask[j>>5] |= (1U << (j&0x1F)); |
3157
|
|
|
|
|
|
|
} |
3158
|
1
|
50
|
|
|
|
|
if (mask != smask) Safefree(mask); |
3159
|
1
|
50
|
|
|
|
|
} else if (k < n) { /* k of n. FYK shuffle n, pick k */ |
3160
|
|
|
|
|
|
|
UV *T; |
3161
|
0
|
0
|
|
|
|
|
New(0, T, n, UV); |
3162
|
0
|
0
|
|
|
|
|
for (i = 0; i < n; i++) |
3163
|
0
|
|
|
|
|
|
T[i] = i; |
3164
|
0
|
0
|
|
|
|
|
for (i = 0; i < k && i <= n-2; i++) { |
|
|
0
|
|
|
|
|
|
3165
|
0
|
|
|
|
|
|
j = urandomm64(ctx,n-i); |
3166
|
0
|
|
|
|
|
|
S[i] = T[i+j]; |
3167
|
0
|
|
|
|
|
|
T[i+j] = T[i]; |
3168
|
|
|
|
|
|
|
} |
3169
|
0
|
|
|
|
|
|
Safefree(T); |
3170
|
|
|
|
|
|
|
} else { /* n of n. FYK shuffle. */ |
3171
|
101
|
100
|
|
|
|
|
for (i = 0; i < n; i++) |
3172
|
100
|
|
|
|
|
|
S[i] = i; |
3173
|
100
|
50
|
|
|
|
|
for (i = 0; i < k && i <= n-2; i++) { |
|
|
100
|
|
|
|
|
|
3174
|
99
|
|
|
|
|
|
j = urandomm64(ctx,n-i); |
3175
|
99
|
|
|
|
|
|
{ UV t = S[i]; S[i] = S[i+j]; S[i+j] = t; } |
3176
|
|
|
|
|
|
|
} |
3177
|
|
|
|
|
|
|
} |
3178
|
3
|
|
|
|
|
|
} |
3179
|
|
|
|
|
|
|
|
3180
|
1
|
|
|
|
|
|
UV random_factored_integer(void* ctx, UV n, int *nf, UV *factors) { |
3181
|
|
|
|
|
|
|
UV r, s, nfac; |
3182
|
1
|
50
|
|
|
|
|
if (n < 1) |
3183
|
0
|
|
|
|
|
|
return 0; |
3184
|
|
|
|
|
|
|
#if BITS_PER_WORD == 64 && (USE_MONTMATH || MULMODS_ARE_FAST) |
3185
|
|
|
|
|
|
|
if (1) /* Our factoring is very fast, just use it */ |
3186
|
|
|
|
|
|
|
#elif BITS_PER_WORD == 64 |
3187
|
|
|
|
|
|
|
if (n < UVCONST(1000000000000)) |
3188
|
|
|
|
|
|
|
#endif |
3189
|
|
|
|
|
|
|
{ |
3190
|
1
|
|
|
|
|
|
r = 1 + urandomm64(ctx, n); |
3191
|
1
|
|
|
|
|
|
*nf = factor(r, factors); |
3192
|
1
|
|
|
|
|
|
return r; |
3193
|
|
|
|
|
|
|
} |
3194
|
|
|
|
|
|
|
do { /* Kalai's algorithm */ |
3195
|
|
|
|
|
|
|
for (s = n, r = 1, nfac = 0; s > 1; ) { |
3196
|
|
|
|
|
|
|
s = 1 + urandomm64(ctx, s); |
3197
|
|
|
|
|
|
|
if (!is_prime(s)) continue; |
3198
|
|
|
|
|
|
|
if (s > n / r) { r = 0; break; } /* overflow */ |
3199
|
|
|
|
|
|
|
r *= s; |
3200
|
|
|
|
|
|
|
factors[nfac++] = s; |
3201
|
|
|
|
|
|
|
} |
3202
|
|
|
|
|
|
|
} while (r == 0 || r > n || (1 + urandomm64(ctx,n)) > r); |
3203
|
|
|
|
|
|
|
*nf = nfac; |
3204
|
|
|
|
|
|
|
return r; |
3205
|
|
|
|
|
|
|
} |