File indexing completed on 2026-11-07 10:15:10
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef DLOG_H
0013 #define DLOG_H
0014
0015 #ifdef DLOG_INLINES_C
0016 #define DLOG_INLINE
0017 #else
0018 #define DLOG_INLINE static inline
0019 #endif
0020
0021 #include "ulong_extras.h"
0022
0023 #ifdef __cplusplus
0024 extern "C" {
0025 #endif
0026
0027 enum
0028 {
0029 DLOG_MODPE, DLOG_CRT, DLOG_POWER, DLOG_BSGS, DLOG_TABLE, DLOG_23
0030 };
0031
0032 typedef struct dlog_precomp_struct dlog_precomp_struct;
0033 typedef struct dlog_precomp_struct * dlog_preconn_ptr;
0034
0035
0036
0037
0038 typedef struct
0039 {
0040 ulong inv1p;
0041 ulong invloga1;
0042 }
0043 dlog_1modpe_struct;
0044
0045 typedef dlog_1modpe_struct dlog_1modpe_t[1];
0046
0047
0048 typedef struct
0049 {
0050 ulong p;
0051 ulong e;
0052 ulong pe1;
0053 ulong inva;
0054 nmod_t pe;
0055 dlog_precomp_struct * modp;
0056 dlog_1modpe_t modpe;
0057 }
0058 dlog_modpe_struct;
0059
0060 typedef dlog_modpe_struct dlog_modpe_t[1];
0061
0062
0063 typedef struct
0064 {
0065 ulong mod;
0066 ulong * table;
0067 }
0068 dlog_table_struct;
0069
0070 typedef dlog_table_struct dlog_table_t[1];
0071
0072
0073
0074 typedef struct apow {
0075 ulong k;
0076 ulong ak;
0077 } apow_t;
0078
0079 int apow_cmp(const apow_t * x, const apow_t * y);
0080
0081 typedef struct {
0082 nmod_t mod;
0083 ulong m;
0084 ulong am;
0085 ulong g;
0086 apow_t * table;
0087 } dlog_bsgs_struct;
0088
0089 typedef dlog_bsgs_struct dlog_bsgs_t[1];
0090
0091
0092
0093 typedef struct {
0094 ulong a;
0095 nmod_t n;
0096 nmod_t mod;
0097 int nisprime;
0098 } dlog_rho_struct;
0099
0100 typedef dlog_rho_struct dlog_rho_t[1];
0101
0102
0103 typedef struct
0104 {
0105 nmod_t mod;
0106 nmod_t n;
0107 ulong num;
0108 ulong * expo;
0109 ulong * crt_coeffs;
0110 dlog_preconn_ptr pre;
0111 }
0112 dlog_crt_struct;
0113
0114 typedef dlog_crt_struct dlog_crt_t[1];
0115
0116
0117 typedef struct
0118 {
0119 nmod_t mod;
0120 ulong p;
0121 ulong e;
0122 ulong * apk;
0123 dlog_precomp_struct * pre;
0124 }
0125 dlog_power_struct;
0126
0127 typedef dlog_power_struct dlog_power_t[1];
0128
0129 typedef ulong dlog_order23_t[1];
0130
0131
0132
0133 struct
0134 dlog_precomp_struct
0135 {
0136 int type;
0137 ulong cost;
0138 union
0139 {
0140 dlog_table_t table;
0141 dlog_bsgs_t bsgs;
0142 dlog_crt_t crt;
0143 dlog_power_t power;
0144 dlog_modpe_t modpe;
0145 dlog_order23_t order23;
0146 } t;
0147 };
0148
0149 typedef dlog_precomp_struct dlog_precomp_t[1];
0150
0151 void dlog_precomp_modpe_init(dlog_precomp_t pre, ulong a, ulong p, ulong e, ulong pe, ulong num);
0152 void dlog_precomp_small_init(dlog_precomp_t pre, ulong a, ulong mod, ulong n, ulong num);
0153 void dlog_precomp_n_init(dlog_precomp_t pre, ulong a, ulong mod, ulong n, ulong num);
0154 void dlog_precomp_p_init(dlog_precomp_t pre, ulong a, ulong mod, ulong p, ulong num);
0155 void dlog_precomp_pe_init(dlog_precomp_t pre, ulong a, ulong mod, ulong p, ulong e, ulong pe, ulong num);
0156 void dlog_precomp_clear(dlog_precomp_t pre);
0157
0158 ulong dlog_precomp(const dlog_precomp_t pre, ulong b);
0159
0160 ulong dlog_order23_init(dlog_order23_t t, ulong a);
0161 ulong dlog_table_init(dlog_table_t t, ulong a, ulong mod);
0162 ulong dlog_crt_init(dlog_crt_t t, ulong a, ulong mod, ulong n, ulong num);
0163 ulong dlog_power_init(dlog_power_t t, ulong a, ulong mod, ulong p, ulong e, ulong num);
0164 ulong dlog_modpe_init(dlog_modpe_t t, ulong a, ulong p, ulong e, ulong pe, ulong num);
0165 ulong dlog_bsgs_init(dlog_bsgs_t t, ulong a, ulong mod, ulong n, ulong m);
0166 void dlog_1modpe_init(dlog_1modpe_t t, ulong a1, ulong p, ulong e, nmod_t pe);
0167 void dlog_rho_init(dlog_rho_t t, ulong a, ulong mod, ulong n);
0168
0169
0170 ulong dlog_once(ulong b, ulong a, const nmod_t mod, ulong n);
0171
0172 DLOG_INLINE void
0173 dlog_order23_clear(dlog_order23_t FLINT_UNUSED(t))
0174 {
0175 return;
0176 }
0177
0178 DLOG_INLINE void
0179 dlog_table_clear(dlog_table_t t)
0180 {
0181 flint_free(t->table);
0182 }
0183
0184 void dlog_crt_clear(dlog_crt_t t);
0185
0186 DLOG_INLINE void
0187 dlog_power_clear(dlog_power_t t)
0188 {
0189 flint_free(t->apk);
0190 dlog_precomp_clear(t->pre);
0191 flint_free(t->pre);
0192 }
0193
0194 DLOG_INLINE void
0195 dlog_modpe_clear(dlog_modpe_t t)
0196 {
0197 dlog_precomp_clear(t->modp);
0198 flint_free(t->modp);
0199 }
0200
0201 DLOG_INLINE void
0202 dlog_bsgs_clear(dlog_bsgs_t t)
0203 {
0204 flint_free(t->table);
0205 }
0206
0207 DLOG_INLINE void
0208 dlog_rho_clear(dlog_rho_t FLINT_UNUSED(t))
0209 {
0210 return;
0211 }
0212
0213 DLOG_INLINE ulong
0214 dlog_bsgs_size(ulong n, ulong num)
0215 {
0216 if (2 * num < n)
0217 return (1 + n_sqrt(n)) * (1 + n_sqrt(num));
0218 else
0219 return n;
0220 }
0221
0222
0223
0224 ulong dlog_order23(const dlog_order23_t t, ulong b);
0225 ulong dlog_table(const dlog_table_t t, ulong b);
0226 ulong dlog_crt(const dlog_crt_t t, ulong b);
0227 ulong dlog_power(const dlog_power_t t, ulong b);
0228 ulong dlog_modpe(const dlog_modpe_t t, ulong b);
0229 ulong dlog_bsgs(const dlog_bsgs_t t, ulong b);
0230 ulong dlog_rho(const dlog_rho_t t, ulong b);
0231 ulong dlog_1modpe_1modp(ulong b1, ulong p, ulong e, ulong inv1p, nmod_t pe);
0232 ulong dlog_1modpe(const dlog_1modpe_t t, ulong b1, ulong p, ulong e, nmod_t pe);
0233 ulong dlog_mod2e_1mod4(ulong b1, ulong e, ulong inva, nmod_t pe);
0234 ulong dlog_mod2e(const dlog_modpe_t t, ulong b);
0235
0236
0237 #define DLOG_SMALL_LIM 50
0238 #define DLOG_TABLE_LIM 50
0239 #define DLOG_TABLE_P_LIM 50
0240 #define DLOG_TABLE_MODPE_LIM 50
0241 #define DLOG_TABLE_PE_LIM 50
0242 #define DLOG_TABLE_N_LIM 50
0243 #define DLOG_BSGS_LIM 500
0244
0245 #define DLOG_LOOP_MAX_FACTOR 6
0246 #define DLOG_G_SMALL 0
0247 #define DLOG_G_BIG 1
0248 void dlog_n_factor_group(n_factor_t * fac, ulong bound);
0249
0250 #define DLOG_NOT_FOUND UWORD_MAX
0251 #define DLOG_NONE UWORD_MAX
0252
0253 ulong dlog_vec_pindex_factorgcd(ulong * v, ulong nv, ulong p, nmod_t mod, ulong a, ulong na, ulong loga, ulong logm1, nmod_t order, int maxtry);
0254 void dlog_vec_fill(ulong * v, ulong nv, ulong x);
0255 void dlog_vec_set_not_found(ulong *v, ulong nv, nmod_t mod);
0256 void dlog_vec_loop(ulong * v, ulong nv, ulong a, ulong va, nmod_t mod, ulong na, nmod_t order);
0257 void dlog_vec_loop_add(ulong * v, ulong nv, ulong a, ulong va, nmod_t mod, ulong na, nmod_t order);
0258 void dlog_vec_eratos_add(ulong * v, ulong nv, ulong a, ulong va, nmod_t mod, ulong na, nmod_t order);
0259 void dlog_vec_eratos(ulong * v, ulong nv, ulong a, ulong va, nmod_t mod, ulong na, nmod_t order);
0260 void dlog_vec_sieve_add(ulong * v, ulong nv, ulong a, ulong va, nmod_t mod, ulong na, nmod_t order);
0261 void dlog_vec_sieve(ulong * v, ulong nv, ulong a, ulong va, nmod_t mod, ulong na, nmod_t order);
0262 void dlog_vec_add(ulong * v, ulong nv, ulong a, ulong va, nmod_t mod, ulong na, nmod_t order);
0263 void dlog_vec(ulong * v, ulong nv, ulong a, ulong va, nmod_t mod, ulong na, nmod_t order);
0264
0265
0266 void dlog_vec_sieve_precomp(ulong *v, ulong nv, dlog_precomp_t pre, ulong a, ulong va, nmod_t mod, ulong na, nmod_t order);
0267 void dlog_vec_sieve_add_precomp(ulong *v, ulong nv, dlog_precomp_t pre, ulong a, ulong va, nmod_t mod, ulong na, nmod_t order);
0268 void dlog_vec_add_precomp(ulong *v, ulong nv, dlog_precomp_t pre, ulong a, ulong va, nmod_t mod, ulong na, nmod_t order);
0269
0270 #ifdef __cplusplus
0271 }
0272 #endif
0273
0274 #endif