Skip to content

Commit ddb57f0

Browse files
committed
access to generator names
1 parent 3c2dcec commit ddb57f0

File tree

19 files changed

+303
-0
lines changed

19 files changed

+303
-0
lines changed

doc/source/gr.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,15 @@ Context operations
278278
The name is used when printing and may be used to choose
279279
coercions.
280280

281+
.. function:: int gr_ctx_ngens(slong * ngens, gr_ctx_t ctx)
282+
283+
Get the number of generators.
284+
285+
.. function:: int gr_ctx_gen_name(char ** name, slong i, gr_ctx_t ctx)
286+
287+
Get the name of the generator of index *i*.
288+
The returned buffer must be freed with :func:`flint_free`.
289+
281290
Element operations
282291
--------------------------------------------------------------------------------
283292

src/gr.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ typedef enum
133133
GR_METHOD_CTX_SET_IS_FIELD,
134134
GR_METHOD_CTX_SET_GEN_NAME,
135135
GR_METHOD_CTX_SET_GEN_NAMES,
136+
GR_METHOD_CTX_NGENS,
137+
GR_METHOD_CTX_GEN_NAME,
136138

137139
GR_METHOD_INIT,
138140
GR_METHOD_CLEAR,
@@ -748,6 +750,8 @@ typedef void ((*gr_method_swap_op)(gr_ptr, gr_ptr, gr_ctx_ptr));
748750
typedef int ((*gr_method_ctx)(gr_ctx_ptr));
749751
typedef void ((*gr_method_ctx_void_op)(gr_ctx_ptr));
750752
typedef truth_t ((*gr_method_ctx_predicate)(gr_ctx_ptr));
753+
typedef slong ((*gr_method_ctx_size)(gr_ctx_ptr));
754+
typedef int ((*gr_method_ctx_gen_name)(char **, slong, gr_ctx_ptr));
751755
typedef int ((*gr_method_ctx_set_si)(gr_ctx_ptr, slong));
752756
typedef int ((*gr_method_ctx_get_si)(slong *, gr_ctx_ptr));
753757
typedef int ((*gr_method_ctx_set_truth)(gr_ctx_ptr, truth_t));
@@ -847,6 +851,8 @@ typedef int ((*gr_method_set_fexpr_op)(gr_ptr, fexpr_vec_t, gr_vec_t, const fexp
847851
#define GR_CTX_VOID_OP(ctx, NAME) (((gr_method_ctx_void_op *) ctx->methods)[GR_METHOD_ ## NAME])
848852
#define GR_CTX_STREAM(ctx, NAME) (((gr_method_ctx_stream *) ctx->methods)[GR_METHOD_ ## NAME])
849853
#define GR_CTX_PREDICATE(ctx, NAME) (((gr_method_ctx_predicate *) ctx->methods)[GR_METHOD_ ## NAME])
854+
#define GR_CTX_SIZE(ctx, NAME) (((gr_method_ctx_size *) ctx->methods)[GR_METHOD_ ## NAME])
855+
#define GR_CTX_GEN_NAME(ctx, NAME) (((gr_method_ctx_gen_name *) ctx->methods)[GR_METHOD_ ## NAME])
850856
#define GR_CTX_SET_SI(ctx, NAME) (((gr_method_ctx_set_si *) ctx->methods)[GR_METHOD_ ## NAME])
851857
#define GR_CTX_GET_SI(ctx, NAME) (((gr_method_ctx_get_si *) ctx->methods)[GR_METHOD_ ## NAME])
852858
#define GR_CTX_SET_TRUTH(ctx, NAME) (((gr_method_ctx_set_truth *) ctx->methods)[GR_METHOD_ ## NAME])
@@ -975,6 +981,8 @@ GR_INLINE WARN_UNUSED_RESULT int gr_ctx_get_real_prec(slong * prec, gr_ctx_t ctx
975981
GR_INLINE WARN_UNUSED_RESULT int gr_ctx_set_is_field(gr_ctx_t ctx, truth_t is_field) { return GR_CTX_SET_TRUTH(ctx, CTX_SET_IS_FIELD)(ctx, is_field); }
976982
GR_INLINE WARN_UNUSED_RESULT int gr_ctx_set_gen_name(gr_ctx_t ctx, const char * s) { return GR_CTX_SET_STR(ctx, CTX_SET_GEN_NAME)(ctx, s); }
977983
GR_INLINE WARN_UNUSED_RESULT int gr_ctx_set_gen_names(gr_ctx_t ctx, const char ** s) { return GR_CTX_SET_STRS(ctx, CTX_SET_GEN_NAMES)(ctx, s); }
984+
GR_INLINE int gr_ctx_ngens(slong * ngens, gr_ctx_t ctx) { return GR_CTX_GET_SI(ctx, CTX_NGENS)(ngens, ctx); }
985+
GR_INLINE int gr_ctx_gen_name(char ** name, slong i, gr_ctx_t ctx) { return GR_CTX_GEN_NAME(ctx, CTX_GEN_NAME)(name, i, ctx); }
978986

979987
GR_INLINE slong _gr_ctx_get_real_prec(gr_ctx_t ctx)
980988
{

src/gr/fmpq_poly.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ int _gr_fmpq_poly_ctx_set_gen_names(gr_ctx_t ctx, const char ** s)
5050
return _gr_fmpq_poly_ctx_set_gen_name(ctx, s[0]);
5151
}
5252

53+
int _gr_gr_poly_ctx_gen_name(char ** name, slong i, gr_ctx_t ctx);
54+
#define _gr_fmpq_poly_ctx_gen_name _gr_gr_poly_ctx_gen_name
5355

5456
int
5557
_gr_fmpq_poly_ctx_write(gr_stream_t out, gr_ctx_t ctx)
@@ -738,6 +740,8 @@ gr_method_tab_input _fmpq_poly_methods_input[] =
738740

739741
{GR_METHOD_CTX_SET_GEN_NAME, (gr_funcptr) _gr_fmpq_poly_ctx_set_gen_name},
740742
{GR_METHOD_CTX_SET_GEN_NAMES, (gr_funcptr) _gr_fmpq_poly_ctx_set_gen_names},
743+
{GR_METHOD_CTX_NGENS, (gr_funcptr) gr_generic_ctx_ngens_1},
744+
{GR_METHOD_CTX_GEN_NAME, (gr_funcptr) _gr_fmpq_poly_ctx_gen_name},
741745
{GR_METHOD_INIT, (gr_funcptr) _gr_fmpq_poly_init},
742746
{GR_METHOD_CLEAR, (gr_funcptr) _gr_fmpq_poly_clear},
743747
{GR_METHOD_SWAP, (gr_funcptr) _gr_fmpq_poly_swap},

src/gr/fmpz_mod_mpoly_q.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,33 @@ _gr_fmpz_mod_mpoly_q_ctx_set_gen_names(gr_ctx_t ctx, const char ** s)
8585

8686
return GR_SUCCESS;
8787
}
88+
89+
slong
90+
_gr_fmpz_mod_mpoly_q_ctx_ngens(slong * ngens, gr_ctx_t ctx)
91+
{
92+
* ngens = MPOLYNOMIAL_MCTX(ctx)->minfo->nvars;
93+
return GR_SUCCESS;
94+
}
95+
96+
int
97+
_gr_fmpz_mod_mpoly_q_ctx_gen_name(char ** name, slong i, gr_ctx_t ctx)
98+
{
99+
if (i < 0 || i >= MPOLYNOMIAL_MCTX(ctx)->minfo->nvars)
100+
return GR_DOMAIN;
101+
102+
if (MPOLYNOMIAL_CTX(ctx)->vars == NULL)
103+
return GR_UNABLE;
104+
105+
char * var = MPOLYNOMIAL_CTX(ctx)->vars[i];
106+
size_t len = strlen(var);
107+
* name = flint_malloc(len + 1);
108+
if (* name == NULL)
109+
return GR_UNABLE;
110+
strncpy(* name, var, len + 1);
111+
112+
return GR_SUCCESS;
113+
}
114+
88115
void
89116
_gr_fmpz_mod_mpoly_q_init(fmpz_mod_mpoly_q_t res, gr_ctx_t ctx)
90117
{
@@ -444,6 +471,8 @@ gr_method_tab_input _gr_fmpz_mod_mpoly_q_methods_input[] =
444471
{GR_METHOD_CTX_IS_FINITE_CHARACTERISTIC, (gr_funcptr) gr_generic_ctx_predicate_true},
445472
{GR_METHOD_CTX_IS_THREADSAFE, (gr_funcptr) gr_generic_ctx_predicate_true},
446473
{GR_METHOD_CTX_SET_GEN_NAMES, (gr_funcptr) _gr_fmpz_mod_mpoly_q_ctx_set_gen_names},
474+
{GR_METHOD_CTX_NGENS, (gr_funcptr) _gr_fmpz_mod_mpoly_q_ctx_ngens},
475+
{GR_METHOD_CTX_GEN_NAME, (gr_funcptr) _gr_fmpz_mod_mpoly_q_ctx_gen_name},
447476
{GR_METHOD_INIT, (gr_funcptr) _gr_fmpz_mod_mpoly_q_init},
448477
{GR_METHOD_CLEAR, (gr_funcptr) _gr_fmpz_mod_mpoly_q_clear},
449478
{GR_METHOD_SWAP, (gr_funcptr) _gr_fmpz_mod_mpoly_q_swap},

src/gr/fmpz_mpoly.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,32 @@ _gr_fmpz_mpoly_ctx_set_gen_names(gr_ctx_t ctx, const char ** s)
8585
return GR_SUCCESS;
8686
}
8787

88+
slong
89+
_gr_fmpz_mpoly_ctx_ngens(slong * ngens, gr_ctx_t ctx)
90+
{
91+
* ngens = MPOLYNOMIAL_MCTX(ctx)->minfo->nvars;
92+
return GR_SUCCESS;
93+
}
94+
95+
int
96+
_gr_fmpz_mpoly_ctx_gen_name(char ** name, slong i, gr_ctx_t ctx)
97+
{
98+
if (i < 0 || i >= MPOLYNOMIAL_MCTX(ctx)->minfo->nvars)
99+
return GR_DOMAIN;
100+
101+
if (MPOLYNOMIAL_CTX(ctx)->vars == NULL)
102+
return GR_UNABLE;
103+
104+
char * var = MPOLYNOMIAL_CTX(ctx)->vars[i];
105+
size_t len = strlen(var);
106+
* name = flint_malloc(len + 1);
107+
if (* name == NULL)
108+
return GR_UNABLE;
109+
strncpy(* name, var, len + 1);
110+
111+
return GR_SUCCESS;
112+
}
113+
88114
void
89115
_gr_fmpz_mpoly_init(fmpz_mpoly_t res, gr_ctx_t ctx)
90116
{
@@ -572,6 +598,8 @@ gr_method_tab_input _gr_fmpz_mpoly_methods_input[] =
572598
{GR_METHOD_CTX_IS_COMPLEX_VECTOR_SPACE, (gr_funcptr) gr_generic_ctx_predicate_false},
573599
{GR_METHOD_CTX_IS_THREADSAFE, (gr_funcptr) gr_generic_ctx_predicate_true},
574600
{GR_METHOD_CTX_SET_GEN_NAMES, (gr_funcptr) _gr_fmpz_mpoly_ctx_set_gen_names},
601+
{GR_METHOD_CTX_NGENS, (gr_funcptr) _gr_fmpz_mpoly_ctx_ngens},
602+
{GR_METHOD_CTX_GEN_NAME, (gr_funcptr) _gr_fmpz_mpoly_ctx_gen_name},
575603
{GR_METHOD_INIT, (gr_funcptr) _gr_fmpz_mpoly_init},
576604
{GR_METHOD_CLEAR, (gr_funcptr) _gr_fmpz_mpoly_clear},
577605
{GR_METHOD_SWAP, (gr_funcptr) _gr_fmpz_mpoly_swap},

src/gr/fmpz_mpoly_q.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,13 @@ int _gr_fmpz_mpoly_q_ctx_write(gr_stream_t out, gr_ctx_t ctx)
4343
/* Some methods are identical to their fmpz_mpoly counterparts */
4444
void _gr_fmpz_mpoly_ctx_clear(gr_ctx_t ctx);
4545
int _gr_fmpz_mpoly_ctx_set_gen_names(gr_ctx_t ctx, const char ** s);
46+
slong _gr_fmpz_mpoly_ctx_ngens(gr_ctx_t ctx);
47+
char const * const _gr_fmpz_mpoly_ctx_gen_name(char ** name, slong i, gr_ctx_t ctx);
4648

4749
#define _gr_fmpz_mpoly_q_ctx_clear _gr_fmpz_mpoly_ctx_clear
4850
#define _gr_fmpz_mpoly_q_ctx_set_gen_names _gr_fmpz_mpoly_ctx_set_gen_names
51+
#define _gr_fmpz_mpoly_q_ctx_ngens _gr_fmpz_mpoly_ctx_ngens
52+
#define _gr_fmpz_mpoly_q_ctx_gen_name _gr_fmpz_mpoly_ctx_gen_name
4953

5054
void
5155
_gr_fmpz_mpoly_q_init(fmpz_mpoly_q_t res, gr_ctx_t ctx)
@@ -535,6 +539,8 @@ gr_method_tab_input _gr_fmpz_mpoly_q_methods_input[] =
535539
{GR_METHOD_CTX_IS_COMPLEX_VECTOR_SPACE, (gr_funcptr) gr_generic_ctx_predicate_false},
536540
{GR_METHOD_CTX_IS_THREADSAFE, (gr_funcptr) gr_generic_ctx_predicate_true},
537541
{GR_METHOD_CTX_SET_GEN_NAMES, (gr_funcptr) _gr_fmpz_mpoly_q_ctx_set_gen_names},
542+
{GR_METHOD_CTX_NGENS, (gr_funcptr) _gr_fmpz_mpoly_q_ctx_ngens},
543+
{GR_METHOD_CTX_GEN_NAME, (gr_funcptr) _gr_fmpz_mpoly_q_ctx_gen_name},
538544
{GR_METHOD_INIT, (gr_funcptr) _gr_fmpz_mpoly_q_init},
539545
{GR_METHOD_CLEAR, (gr_funcptr) _gr_fmpz_mpoly_q_clear},
540546
{GR_METHOD_SWAP, (gr_funcptr) _gr_fmpz_mpoly_q_swap},

src/gr/fmpz_poly.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ int _gr_fmpz_poly_ctx_set_gen_names(gr_ctx_t ctx, const char ** s)
5353
return _gr_fmpz_poly_ctx_set_gen_name(ctx, s[0]);
5454
}
5555

56+
int _gr_gr_poly_ctx_gen_name(char ** name, slong i, gr_ctx_t ctx);
57+
#define _gr_fmpz_poly_ctx_gen_name _gr_gr_poly_ctx_gen_name
58+
5659
int
5760
_gr_fmpz_poly_ctx_write(gr_stream_t out, gr_ctx_t ctx)
5861
{
@@ -831,6 +834,8 @@ gr_method_tab_input _fmpz_poly_methods_input[] =
831834

832835
{GR_METHOD_CTX_SET_GEN_NAME, (gr_funcptr) _gr_fmpz_poly_ctx_set_gen_name},
833836
{GR_METHOD_CTX_SET_GEN_NAMES, (gr_funcptr) _gr_fmpz_poly_ctx_set_gen_names},
837+
{GR_METHOD_CTX_NGENS, (gr_funcptr) gr_generic_ctx_ngens_1},
838+
{GR_METHOD_CTX_GEN_NAME, (gr_funcptr) _gr_fmpz_poly_ctx_gen_name},
834839

835840
{GR_METHOD_INIT, (gr_funcptr) _gr_fmpz_poly_init},
836841
{GR_METHOD_CLEAR, (gr_funcptr) _gr_fmpz_poly_clear},

src/gr/fmpzi.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
*/
1111

1212
#include <math.h>
13+
#include <string.h>
1314
#include "fmpq.h"
1415
#include "fexpr.h"
1516
#include "qqbar.h"
@@ -24,6 +25,20 @@ _gr_fmpzi_ctx_write(gr_stream_t out, gr_ctx_t ctx)
2425
return GR_SUCCESS;
2526
}
2627

28+
int
29+
_gr_fmpzi_ctx_gen_name(char ** name, slong i, gr_ctx_t ctx)
30+
{
31+
if (i != 0)
32+
return GR_DOMAIN;
33+
34+
* name = flint_malloc(2);
35+
if (* name == NULL)
36+
return GR_UNABLE;
37+
strncpy(* name, "I", 2);
38+
39+
return GR_SUCCESS;
40+
}
41+
2742
void
2843
_gr_fmpzi_init(fmpzi_t x, const gr_ctx_t ctx)
2944
{
@@ -954,6 +969,8 @@ gr_method_tab_input _fmpzi_methods_input[] =
954969
{GR_METHOD_CTX_IS_EXACT, (gr_funcptr) gr_generic_ctx_predicate_true},
955970
{GR_METHOD_CTX_IS_CANONICAL,
956971
(gr_funcptr) gr_generic_ctx_predicate_true},
972+
{GR_METHOD_CTX_NGENS, (gr_funcptr) gr_generic_ctx_ngens_1},
973+
{GR_METHOD_CTX_GEN_NAME, (gr_funcptr) _gr_fmpzi_ctx_gen_name},
957974
{GR_METHOD_INIT, (gr_funcptr) _gr_fmpzi_init},
958975
{GR_METHOD_CLEAR, (gr_funcptr) _gr_fmpzi_clear},
959976
{GR_METHOD_SWAP, (gr_funcptr) _gr_fmpzi_swap},

src/gr/fq.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,22 @@ int _gr_fq_ctx_set_gen_names(gr_ctx_t ctx, const char ** s)
5858
return _gr_fq_ctx_set_gen_name(ctx, s[0]);
5959
}
6060

61+
int
62+
_gr_fq_ctx_gen_name(char ** name, slong i, gr_ctx_t ctx)
63+
{
64+
if (i != 0)
65+
return GR_DOMAIN;
66+
67+
char * var = FQ_CTX(ctx)->var;
68+
size_t len = strlen(var);
69+
* name = flint_malloc(len + 1);
70+
if (* name == NULL)
71+
return GR_UNABLE;
72+
strncpy(* name, var, len + 1);
73+
74+
return GR_SUCCESS;
75+
}
76+
6177
void
6278
_gr_fq_init(fq_t x, const gr_ctx_t ctx)
6379
{
@@ -716,6 +732,8 @@ gr_method_tab_input _fq_methods_input[] =
716732
{GR_METHOD_CTX_WRITE, (gr_funcptr) _gr_fq_ctx_write},
717733
{GR_METHOD_CTX_SET_GEN_NAME, (gr_funcptr) _gr_fq_ctx_set_gen_name},
718734
{GR_METHOD_CTX_SET_GEN_NAMES, (gr_funcptr) _gr_fq_ctx_set_gen_names},
735+
{GR_METHOD_CTX_NGENS, (gr_funcptr) gr_generic_ctx_ngens_1},
736+
{GR_METHOD_CTX_GEN_NAME, (gr_funcptr) _gr_fq_ctx_gen_name},
719737
{GR_METHOD_CTX_IS_RING, (gr_funcptr) gr_generic_ctx_predicate_true},
720738
{GR_METHOD_CTX_IS_COMMUTATIVE_RING, (gr_funcptr) gr_generic_ctx_predicate_true},
721739
{GR_METHOD_CTX_IS_INTEGRAL_DOMAIN, (gr_funcptr) gr_generic_ctx_predicate_true},

src/gr/fq_nmod.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,22 @@ int _gr_fq_nmod_ctx_set_gen_names(gr_ctx_t ctx, const char ** s)
5959
return _gr_fq_nmod_ctx_set_gen_name(ctx, s[0]);
6060
}
6161

62+
int
63+
_gr_fq_nmod_ctx_gen_name(char ** name, slong i, gr_ctx_t ctx)
64+
{
65+
if (i != 0)
66+
return GR_DOMAIN;
67+
68+
char * var = FQ_CTX(ctx)->var;
69+
size_t len = strlen(var);
70+
* name = flint_malloc(len + 1);
71+
if (* name == NULL)
72+
return GR_UNABLE;
73+
strncpy(* name, var, len + 1);
74+
75+
return GR_SUCCESS;
76+
}
77+
6278
void
6379
_gr_fq_nmod_init(fq_nmod_t x, const gr_ctx_t ctx)
6480
{
@@ -679,6 +695,8 @@ gr_method_tab_input _fq_nmod_methods_input[] =
679695
{GR_METHOD_CTX_WRITE, (gr_funcptr) _gr_fq_nmod_ctx_write},
680696
{GR_METHOD_CTX_SET_GEN_NAME, (gr_funcptr) _gr_fq_nmod_ctx_set_gen_name},
681697
{GR_METHOD_CTX_SET_GEN_NAMES, (gr_funcptr) _gr_fq_nmod_ctx_set_gen_names},
698+
{GR_METHOD_CTX_NGENS, (gr_funcptr) gr_generic_ctx_ngens_1},
699+
{GR_METHOD_CTX_GEN_NAME, (gr_funcptr) _gr_fq_nmod_ctx_gen_name},
682700
{GR_METHOD_CTX_IS_RING, (gr_funcptr) gr_generic_ctx_predicate_true},
683701
{GR_METHOD_CTX_IS_COMMUTATIVE_RING, (gr_funcptr) gr_generic_ctx_predicate_true},
684702
{GR_METHOD_CTX_IS_INTEGRAL_DOMAIN, (gr_funcptr) gr_generic_ctx_predicate_true},

0 commit comments

Comments
 (0)