File indexing completed on 2026-11-07 10:15:34
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef PADIC_RADIX_H
0013 #define PADIC_RADIX_H
0014
0015 #ifdef PADIC_RADIX_INLINES_C
0016 #define PADIC_RADIX_INLINE
0017 #else
0018 #define PADIC_RADIX_INLINE static inline
0019 #endif
0020
0021 #include "radix.h"
0022
0023 #ifdef __cplusplus
0024 extern "C" {
0025 #endif
0026
0027 #define PADIC_RADIX_EXACT WORD_MAX
0028 #define PADIC_RADIX_PREC_INF WORD_MAX
0029 #define PADIC_RADIX_ERR_MAX (WORD_MAX / 4)
0030
0031
0032 #define PADIC_RADIX_SIGNED 1
0033 #define PADIC_RADIX_NO_ERROR 2
0034 #define PADIC_RADIX_DECIMAL 4
0035 #define PADIC_RADIX_TEST_LIMITS 8
0036
0037 typedef struct
0038 {
0039 radix_integer_struct u;
0040 slong v;
0041 slong N;
0042 }
0043 padic_radix_struct;
0044
0045 typedef padic_radix_struct padic_radix_t[1];
0046
0047 #define PADIC_RADIX_UNIT(x) (&((x)->u))
0048 #define PADIC_RADIX_VAL(x) ((x)->v)
0049 #define PADIC_RADIX_N(x) ((x)->N)
0050
0051 typedef struct
0052 {
0053 radix_struct radix;
0054 ulong p;
0055 slong prec_abs;
0056 slong prec_rel;
0057 int flags;
0058 }
0059 padic_radix_ctx_struct;
0060
0061 typedef padic_radix_ctx_struct padic_radix_ctx_t[1];
0062
0063 #define GR_PADIC_RADIX_CTX(ctx) ((padic_radix_ctx_struct *) (GR_CTX_DATA_AS_PTR(ctx)))
0064 #define PADIC_RADIX_CTX_RADIX(ctx) (&(GR_PADIC_RADIX_CTX(ctx)->radix))
0065 #define PADIC_RADIX_CTX_PREC_ABS(ctx) (GR_PADIC_RADIX_CTX(ctx)->prec_abs)
0066 #define PADIC_RADIX_CTX_PREC_REL(ctx) (GR_PADIC_RADIX_CTX(ctx)->prec_rel)
0067 #define PADIC_RADIX_CTX_FLAGS(ctx) (GR_PADIC_RADIX_CTX(ctx)->flags)
0068 #define PADIC_RADIX_CTX_SIGNED(ctx) (GR_PADIC_RADIX_CTX(ctx)->flags & PADIC_RADIX_SIGNED)
0069 #define PADIC_RADIX_CTX_DECIMAL(ctx) (GR_PADIC_RADIX_CTX(ctx)->flags & PADIC_RADIX_DECIMAL)
0070
0071
0072 int gr_ctx_init_padic_radix(gr_ctx_t ctx, ulong p, slong prec_rel, slong prec_abs, int flags);
0073 int gr_ctx_init_padic_radix_randtest(gr_ctx_t ctx, flint_rand_t state, slong maxprec);
0074
0075 void padic_radix_ctx_clear(gr_ctx_t ctx);
0076 int padic_radix_ctx_write(gr_stream_t out, gr_ctx_t ctx);
0077
0078
0079 void padic_radix_init(padic_radix_t res, gr_ctx_t ctx);
0080 void padic_radix_clear(padic_radix_t res, gr_ctx_t ctx);
0081 void padic_radix_swap(padic_radix_t x, padic_radix_t y, gr_ctx_t ctx);
0082 void padic_radix_set_shallow(padic_radix_t res, const padic_radix_t x, gr_ctx_t ctx);
0083
0084
0085 slong padic_radix_get_error(const padic_radix_t x, gr_ctx_t ctx);
0086 truth_t padic_radix_is_exact(const padic_radix_t x, gr_ctx_t ctx);
0087
0088 int _padic_radix_finalize(padic_radix_t res, gr_ctx_t ctx);
0089
0090
0091 int padic_radix_randtest(padic_radix_t res, flint_rand_t state, gr_ctx_t ctx);
0092 int padic_radix_write(gr_stream_t out, const padic_radix_t x, gr_ctx_t ctx);
0093 int padic_radix_zero(padic_radix_t res, gr_ctx_t ctx);
0094 int padic_radix_one(padic_radix_t res, gr_ctx_t ctx);
0095 int padic_radix_set(padic_radix_t res, const padic_radix_t x, gr_ctx_t ctx);
0096 int padic_radix_set_ui(padic_radix_t res, ulong x, gr_ctx_t ctx);
0097 int padic_radix_set_si(padic_radix_t res, slong x, gr_ctx_t ctx);
0098 int padic_radix_set_fmpz(padic_radix_t res, const fmpz_t x, gr_ctx_t ctx);
0099 int padic_radix_exact_set_ui(padic_radix_t res, ulong x, gr_ctx_t ctx);
0100 int padic_radix_exact_set_si(padic_radix_t res, slong x, gr_ctx_t ctx);
0101 int padic_radix_exact_set_fmpz(padic_radix_t res, const fmpz_t x, gr_ctx_t ctx);
0102 int padic_radix_get_fmpz(fmpz_t res, const padic_radix_t x, gr_ctx_t ctx);
0103 int padic_radix_neg(padic_radix_t res, const padic_radix_t x, gr_ctx_t ctx);
0104 int padic_radix_add(padic_radix_t res, const padic_radix_t x, const padic_radix_t y, gr_ctx_t ctx);
0105 int padic_radix_sub(padic_radix_t res, const padic_radix_t x, const padic_radix_t y, gr_ctx_t ctx);
0106 int padic_radix_mul(padic_radix_t res, const padic_radix_t x, const padic_radix_t y, gr_ctx_t ctx);
0107 int padic_radix_inv(padic_radix_t res, const padic_radix_t x, gr_ctx_t ctx);
0108 int padic_radix_div(padic_radix_t res, const padic_radix_t x, const padic_radix_t y, gr_ctx_t ctx);
0109 int padic_radix_sqrt(padic_radix_t res, const padic_radix_t x, gr_ctx_t ctx);
0110 int padic_radix_rsqrt(padic_radix_t res, const padic_radix_t x, gr_ctx_t ctx);
0111 truth_t padic_radix_is_square(const padic_radix_t x, gr_ctx_t ctx);
0112
0113 truth_t padic_radix_is_zero(const padic_radix_t x, gr_ctx_t ctx);
0114 truth_t padic_radix_is_one(const padic_radix_t x, gr_ctx_t ctx);
0115 truth_t padic_radix_is_neg_one(const padic_radix_t x, gr_ctx_t ctx);
0116 truth_t padic_radix_is_invertible(const padic_radix_t x, gr_ctx_t ctx);
0117 truth_t padic_radix_equal(const padic_radix_t x, const padic_radix_t y, gr_ctx_t ctx);
0118
0119 int padic_radix_dot(padic_radix_t res, const padic_radix_t initial,
0120 int subtract, const padic_radix_struct * vec1,
0121 const padic_radix_struct * vec2, slong len, gr_ctx_t ctx);
0122 int padic_radix_dot_rev(padic_radix_t res, const padic_radix_t initial,
0123 int subtract, const padic_radix_struct * vec1,
0124 const padic_radix_struct * vec2, slong len, gr_ctx_t ctx);
0125
0126 int padic_radix_dot_strided(padic_radix_t res, const padic_radix_t initial,
0127 int subtract, const padic_radix_struct * vec1, slong stride1,
0128 const padic_radix_struct * vec2, slong stride2, slong len, gr_ctx_t ctx);
0129 int padic_radix_dot_strided_delayed(padic_radix_t res, const padic_radix_t initial,
0130 int subtract, const padic_radix_struct * vec1, slong stride1,
0131 const padic_radix_struct * vec2, slong stride2, slong len, gr_ctx_t ctx);
0132 int padic_radix_dot_strided_naive(padic_radix_t res, const padic_radix_t initial,
0133 int subtract, const padic_radix_struct * vec1, slong stride1,
0134 const padic_radix_struct * vec2, slong stride2, slong len, gr_ctx_t ctx);
0135
0136 slong _padic_radix_exp_bound(slong v, slong N, ulong p);
0137
0138 void _padic_radix_exp_rectangular(radix_integer_t rop, const radix_integer_t u, slong v, slong N, const radix_t radix);
0139 void _padic_radix_exp_balanced(radix_integer_t rop, const radix_integer_t u, slong v, slong N, const radix_t radix);
0140 void _padic_radix_exp(radix_integer_t rop, const radix_integer_t u, slong v, slong N, const radix_t radix);
0141
0142 int padic_radix_exp_rectangular(padic_radix_t res, const padic_radix_t x, gr_ctx_t ctx);
0143 int padic_radix_exp_balanced(padic_radix_t res, const padic_radix_t x, gr_ctx_t ctx);
0144 int padic_radix_exp(padic_radix_t res, const padic_radix_t x, gr_ctx_t ctx);
0145
0146 slong _padic_radix_log_bound(slong v, slong N, ulong p);
0147
0148 void _padic_radix_log_rectangular(radix_integer_t rop, const radix_integer_t y, slong N, const radix_t radix);
0149 void _padic_radix_log_balanced(radix_integer_t rop, const radix_integer_t y, slong N, const radix_t radix);
0150 void _padic_radix_log(radix_integer_t rop, const radix_integer_t y, slong N, const radix_t radix);
0151
0152 int padic_radix_log_rectangular(padic_radix_t res, const padic_radix_t x, gr_ctx_t ctx);
0153 int padic_radix_log_balanced(padic_radix_t res, const padic_radix_t x, gr_ctx_t ctx);
0154 int padic_radix_log(padic_radix_t res, const padic_radix_t x, gr_ctx_t ctx);
0155
0156
0157 int _padic_radix_add_sub_reference(padic_radix_t res, const padic_radix_t x, const padic_radix_t y, int sub, gr_ctx_t ctx);
0158 int _padic_radix_mul_reference(padic_radix_t res, const padic_radix_t x, const padic_radix_t y, gr_ctx_t ctx);
0159
0160
0161 #ifdef __cplusplus
0162 }
0163 #endif
0164
0165 #endif