Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-11-07 10:15:34

0001 /*
0002     Copyright (C) 2026 Fredrik Johansson
0003 
0004     This file is part of FLINT.
0005 
0006     FLINT is free software: you can redistribute it and/or modify it under
0007     the terms of the GNU Lesser General Public License (LGPL) as published
0008     by the Free Software Foundation; either version 3 of the License, or
0009     (at your option) any later version.  See <https://www.gnu.org/licenses/>.
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            /* N value marking an exact element */
0028 #define PADIC_RADIX_PREC_INF  WORD_MAX            /* context precision: "infinite" */
0029 #define PADIC_RADIX_ERR_MAX   (WORD_MAX / 4)      /* largest finite precision we store */
0030 
0031 /* context option flags */
0032 #define PADIC_RADIX_SIGNED    1                   /* allow signed units for exact elements */
0033 #define PADIC_RADIX_NO_ERROR  2                   /* floating-point mode: never track error (future) */
0034 #define PADIC_RADIX_DECIMAL   4                   /* print the unit as a decimal integer */
0035 #define PADIC_RADIX_TEST_LIMITS 8                 /* randtest: exercise the v/N representability limits */
0036 
0037 typedef struct
0038 {
0039     radix_integer_struct u;     /* unit (limbs in radix B = p^e) */
0040     slong v;                    /* valuation, in powers of p */
0041     slong N;                    /* O(p^N); PADIC_RADIX_EXACT if exact */
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;     /* digit radix p, limb radix p^e */
0054     ulong p;                /* the prime */
0055     slong prec_abs;         /* default absolute precision (PADIC_RADIX_PREC_INF for none) */
0056     slong prec_rel;         /* default relative precision (PADIC_RADIX_PREC_INF for none) */
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 /* Context management */
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 /* Memory management */
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 /* Error term access */
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 /* Basic assignment and predicates */
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 /* For testing */
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