Skip to content

Commit ec10b08

Browse files
committed
Added to_from_fmpz to fmpz_mod_mpoly
1 parent 6d752c9 commit ec10b08

File tree

8 files changed

+242
-4
lines changed

8 files changed

+242
-4
lines changed

src/fmpz_mod_mpoly.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,9 @@ int fmpz_mod_mpoly_quadratic_root(fmpz_mod_mpoly_t Q,
712712
void fmpz_mod_mpoly_term_content(fmpz_mod_mpoly_t M,
713713
const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx);
714714

715+
void fmpz_mod_mpoly_monic_part(fmpz_mod_mpoly_t res,
716+
const fmpz_mod_mpoly_t f, const fmpz_mod_mpoly_ctx_t ctx);
717+
715718
int fmpz_mod_mpoly_content_vars(fmpz_mod_mpoly_t g,
716719
const fmpz_mod_mpoly_t A, slong * vars, slong vars_length,
717720
const fmpz_mod_mpoly_ctx_t ctx);
@@ -1000,6 +1003,13 @@ int fmpz_mod_mpoly_vec_is_autoreduced(const fmpz_mod_mpoly_vec_t G,
10001003
void fmpz_mod_mpoly_vec_autoreduction_groebner(fmpz_mod_mpoly_vec_t H,
10011004
const fmpz_mod_mpoly_vec_t G, const fmpz_mod_mpoly_ctx_t ctx);
10021005

1006+
/* Convert to/from fmpz_mpoly */
1007+
1008+
void fmpz_mod_mpoly_from_fmpz_mpoly(fmpz_mod_mpoly_t res,
1009+
const fmpz_mpoly_t f, fmpz_mod_mpoly_ctx_t ctxm, fmpz_mpoly_ctx_t ctx);
1010+
1011+
void fmpz_mod_mpoly_to_fmpz_mpoly(fmpz_mpoly_t res,
1012+
const fmpz_mod_mpoly_t f, fmpz_mpoly_ctx_t ctx, fmpz_mod_mpoly_ctx_t ctxm);
10031013

10041014

10051015
/******************************************************************************

src/fmpz_mod_mpoly/buchberger_naive.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ within_limits(const fmpz_mod_mpoly_t poly, slong poly_len_limit, const fmpz_mod_
166166
{
167167
if (fmpz_mod_mpoly_length(poly, ctx) > poly_len_limit)
168168
return 0;
169-
169+
170170
return 1;
171171
}
172172

src/fmpz_mod_mpoly/monic_part.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
Copyright (C) 2020 Fredrik Johansson
3+
4+
This file is part of FLINT.
5+
6+
FLINT is free software: you can redistribute it and/or modify it under
7+
the terms of the GNU Lesser General Public License (LGPL) as published
8+
by the Free Software Foundation; either version 3 of the License, or
9+
(at your option) any later version. See <https://www.gnu.org/licenses/>.
10+
*/
11+
12+
#include "fmpz.h"
13+
#include "fmpz_mod.h"
14+
#include "fmpz_vec.h"
15+
#include "fmpz_mod_mpoly.h"
16+
17+
void
18+
fmpz_mod_mpoly_monic_part(fmpz_mod_mpoly_t res, const fmpz_mod_mpoly_t f, const fmpz_mod_mpoly_ctx_t ctx)
19+
{
20+
if (res != f)
21+
fmpz_mod_mpoly_set(res, f, ctx);
22+
23+
if (fmpz_mod_mpoly_is_zero(res, ctx))
24+
return;
25+
26+
if (fmpz_sgn(res->coeffs) < 0)
27+
fmpz_mod_mpoly_neg(res, res, ctx);
28+
29+
if (!fmpz_is_one(res->coeffs))
30+
{
31+
fmpz_t c;
32+
fmpz_init(c);
33+
34+
_fmpz_vec_content(c, res->coeffs, res->length);
35+
if (!fmpz_is_one(c))
36+
37+
fmpz_mod_inv(c, c, ctx->ffinfo);
38+
fmpz_mod_mpoly_scalar_mul_fmpz(res, res, c, ctx);
39+
40+
fmpz_clear(c);
41+
}
42+
}

src/fmpz_mod_mpoly/spoly.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ fmpz_mod_mpoly_spoly(fmpz_mod_mpoly_t res, const fmpz_mod_mpoly_t f, const fmpz_
3232
exp = flint_malloc(sizeof(ulong) * n);
3333
expf = flint_malloc(sizeof(ulong) * n);
3434
expg = flint_malloc(sizeof(ulong) * n);
35-
3635
fmpz_mod_mpoly_init(T, ctx);
3736
fmpz_mod_mpoly_init(U, ctx);
3837

@@ -53,8 +52,8 @@ fmpz_mod_mpoly_spoly(fmpz_mod_mpoly_t res, const fmpz_mod_mpoly_t f, const fmpz_
5352
else
5453
{
5554
fmpz_t c;
56-
fmpz_mod_inv(c, f->coeffs, ctx->ffinfo);
5755
fmpz_init(c);
56+
fmpz_mod_inv(c, f->coeffs, ctx->ffinfo);
5857
fmpz_mod_mpoly_set_coeff_fmpz_ui(T, c, expf, ctx);
5958
fmpz_clear(c);
6059
}

src/fmpz_mod_mpoly/test/main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
#include "t-scalar_addmul_fmpz.c"
5757
#include "t-scalar_mul_fmpz.c"
5858
#include "t-sqrt.c"
59+
#include "t-to_from_fmpz_mpoly.c"
5960
#include "t-total_degree.c"
6061
#include "t-univar_resultant.c"
6162
#include "t-used_vars.c"
@@ -79,6 +80,7 @@ test_struct tests[] =
7980
TEST_FUNCTION(fmpz_mod_mpoly_div_monagan_pearce),
8081
TEST_FUNCTION(fmpz_mod_mpoly_divrem),
8182
TEST_FUNCTION(fmpz_mod_mpoly_divrem_ideal_monagan_pearce),
83+
TEST_FUNCTION(fmpz_mod_mpoly_from_fmpz_mpoly),
8284
TEST_FUNCTION(fmpz_mod_mpoly_evaluate),
8385
TEST_FUNCTION(fmpz_mod_mpoly_gcd_brown),
8486
TEST_FUNCTION(fmpz_mod_mpoly_gcd_cofactors),

src/fmpz_mod_mpoly/test/t-buchberger_naive.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ TEST_FUNCTION_START(fmpz_mod_mpoly_buchberger_naive, state)
4646
else if (nvars == 3)
4747
fmpz_mod_mpoly_vec_randtest_not_zero(F, state, 1 + n_randint(state, 4), 1 + n_randint(state, 4), 1 + n_randint(state, 2), ctx);
4848
else
49-
fmpz_mod_mpoly_vec_randtest_not_zero(F, state, 1 + n_randint(state, 5), 1 + n_randint(state, 5), 1 + n_randint(state, 3), ctx);
49+
fmpz_mod_mpoly_vec_randtest_not_zero(F, state, 1 + n_randint(state, 5), 10+fmpz_bits(m), 1 + n_randint(state, 3), ctx);
5050

5151
// flint_printf("F = "); fmpz_mod_mpoly_vec_print(F, ctx); flint_printf("\n");
5252

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/*
2+
Copyright (C) 2025 Andrii Yanovets
3+
4+
This file is part of FLINT.
5+
6+
FLINT is free software: you can redistribute it and/or modify it under
7+
the terms of the GNU Lesser General Public License (LGPL) as published
8+
by the Free Software Foundation; either version 3 of the License, or
9+
(at your option) any later version. See <https://www.gnu.org/licenses/>.
10+
*/
11+
12+
#include "test_helpers.h"
13+
#include "calcium.h"
14+
#include "fmpz_mod_mpoly.h"
15+
#include "fmpz_mpoly.h"
16+
#include "mpoly.h"
17+
18+
TEST_FUNCTION_START(fmpz_mod_mpoly_from_fmpz_mpoly, state)
19+
{
20+
slong iter;
21+
22+
for (iter = 0; iter < 10000 * 0.1 * flint_test_multiplier(); iter++)
23+
{
24+
fmpz_mpoly_ctx_t ctx;
25+
fmpz_mod_mpoly_ctx_t ctxm;
26+
fmpz_mod_mpoly_t A, B;
27+
fmpz_mpoly_t C, D;
28+
slong nvars, i;
29+
fmpz_t m, c;
30+
31+
nvars = 1 + n_randint(state, 3);
32+
fmpz_init(m);
33+
fmpz_init(c);
34+
fmpz_randtest_unsigned(m, state, n_randint(state, 2) ? 4 : n_randint(state, 90));
35+
fmpz_nextprime(m, m, 0);
36+
fmpz_mod_mpoly_ctx_init(ctxm, nvars, ORD_LEX, m);
37+
fmpz_mpoly_ctx_init(ctx, nvars, ORD_LEX);
38+
39+
fmpz_mod_mpoly_init(A, ctxm);
40+
fmpz_mod_mpoly_init(B, ctxm);
41+
fmpz_mpoly_init(C, ctx);
42+
fmpz_mpoly_init(D, ctx);
43+
44+
fmpz ** exp = (fmpz **) flint_malloc(ctx->minfo->nvars*sizeof(fmpz *));
45+
46+
for (i = 0; i < ctx->minfo->nvars; i++)
47+
{
48+
exp[i] = (fmpz *) flint_malloc(sizeof(fmpz));
49+
fmpz_init(exp[i]);
50+
}
51+
52+
// flint_printf("iter %wd %wd %d %{fmpz}\n\n", iter, nvars, ctx->minfo->ord, m);
53+
// printf("--------------------------------------------------------------------\n");
54+
55+
56+
fmpz_mpoly_randtest_bound(C, state, 1 + n_randint(state, 4), 1 + n_randint(state, 4), 1 + n_randint(state, 4), ctx);
57+
58+
fmpz_mod_mpoly_resize(B, C->length, ctxm);
59+
60+
for (i = 0; i< C->length; i++)
61+
{
62+
fmpz_mpoly_get_term_coeff_fmpz(c, C, i, ctx);
63+
fmpz_mpoly_get_term_exp_fmpz(exp, C, i, ctx);
64+
65+
fmpz_mod_mpoly_set_term_exp_fmpz(B, i, exp, ctxm);
66+
fmpz_mod_mpoly_set_term_coeff_fmpz(B, i, c, ctxm);
67+
}
68+
69+
fmpz_mod_mpoly_combine_like_terms(B, ctxm);
70+
fmpz_mod_mpoly_from_fmpz_mpoly(A, C, ctxm, ctx);
71+
72+
if (!fmpz_mod_mpoly_equal(A, B, ctxm))
73+
{
74+
flint_printf("FAIL\n\n");
75+
mpoly_ordering_print(ctx->minfo->ord); printf("\n");
76+
flint_printf("C = "); fmpz_mpoly_print_pretty(C, NULL, ctx); flint_printf("\n");
77+
flint_printf("A = "); fmpz_mod_mpoly_print_pretty(A, NULL, ctxm); flint_printf("\n");
78+
flint_printf("B = "); fmpz_mod_mpoly_print_pretty(B, NULL, ctxm); flint_printf("\n");
79+
flint_abort();
80+
}
81+
82+
fmpz_mpoly_resize(C, A->length, ctx);
83+
84+
for (i = 0; i< A->length; i++)
85+
{
86+
fmpz_mod_mpoly_get_term_coeff_fmpz(c, A, i, ctxm);
87+
fmpz_mod_mpoly_get_term_exp_fmpz(exp, A, i, ctxm);
88+
89+
fmpz_mpoly_set_term_exp_fmpz(C, i, exp, ctx);
90+
fmpz_mpoly_set_term_coeff_fmpz(C, i, c, ctx);
91+
}
92+
93+
fmpz_mod_mpoly_to_fmpz_mpoly(D, A, ctx, ctxm);
94+
95+
if (!fmpz_mpoly_equal(C, D, ctx))
96+
{
97+
flint_printf("FAIL\n\n");
98+
mpoly_ordering_print(ctx->minfo->ord); printf("\n");
99+
flint_printf("C = "); fmpz_mpoly_print_pretty(C, NULL, ctx); flint_printf("\n");
100+
flint_printf("D = "); fmpz_mpoly_print_pretty(D, NULL, ctx); flint_printf("\n");
101+
flint_printf("A = "); fmpz_mod_mpoly_print_pretty(A, NULL, ctxm); flint_printf("\n");
102+
flint_abort();
103+
}
104+
105+
for (i = 0; i < ctx->minfo->nvars; i++)
106+
{
107+
fmpz_clear(exp[i]);
108+
flint_free(exp[i]);
109+
}
110+
flint_free(exp);
111+
112+
fmpz_mod_mpoly_clear(A, ctxm);
113+
fmpz_mod_mpoly_clear(B, ctxm);
114+
fmpz_mpoly_clear(C, ctx);
115+
fmpz_mpoly_clear(D, ctx);
116+
117+
fmpz_mod_mpoly_ctx_clear(ctxm);
118+
fmpz_mpoly_ctx_clear(ctx);
119+
120+
fmpz_clear(m);
121+
fmpz_clear(c);
122+
}
123+
124+
TEST_FUNCTION_END(state);
125+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
Copyright (C) 2025 Andrii Yanovets
3+
4+
This file is part of FLINT.
5+
6+
FLINT is free software: you can redistribute it and/or modify it under
7+
the terms of the GNU Lesser General Public License (LGPL) as published
8+
by the Free Software Foundation; either version 3 of the License, or
9+
(at your option) any later version. See <https://www.gnu.org/licenses/>.
10+
*/
11+
#include "fmpz.h"
12+
#include "fmpz_mod.h"
13+
#include "fmpz_mod_mpoly.h"
14+
#include "fmpz_mpoly.h"
15+
#include "mpoly.h"
16+
17+
void
18+
fmpz_mod_mpoly_from_fmpz_mpoly(fmpz_mod_mpoly_t res, const fmpz_mpoly_t f, fmpz_mod_mpoly_ctx_t ctxm, fmpz_mpoly_ctx_t ctx)
19+
{
20+
slong N = mpoly_words_per_exp(f->bits, ctx->minfo);
21+
slong res_len, i;
22+
FLINT_ASSERT(ctx->minfo->nvars == ctx->minfo->nvars);
23+
FLINT_ASSERT(ctx->minfo->ord == ctx->minfo->ord);
24+
fmpz_mod_mpoly_fit_length_reset_bits(res, f->length, f->bits, ctxm);
25+
res_len = 0;
26+
for (i = 0; i < f->length; i++)
27+
{
28+
29+
fmpz_mod_set_fmpz(res->coeffs+res_len,f->coeffs + i, ctxm->ffinfo);
30+
31+
if (res->coeffs[res_len] == 0)
32+
continue;
33+
34+
mpoly_monomial_set(res->exps + N*res_len, f->exps + N*i, N);
35+
res_len++;
36+
}
37+
res->length = res_len;
38+
}
39+
40+
void
41+
fmpz_mod_mpoly_to_fmpz_mpoly(fmpz_mpoly_t res, const fmpz_mod_mpoly_t f, fmpz_mpoly_ctx_t ctx, fmpz_mod_mpoly_ctx_t ctxm)
42+
{
43+
slong N = mpoly_words_per_exp(f->bits, ctx->minfo);
44+
slong res_len, i;
45+
FLINT_ASSERT(ctx->minfo->nvars == ctx->minfo->nvars);
46+
FLINT_ASSERT(ctx->minfo->ord == ctx->minfo->ord);
47+
fmpz_mpoly_fit_length_reset_bits(res, f->length, f->bits, ctx);
48+
res_len = 0;
49+
for (i = 0; i < f->length; i++)
50+
{
51+
fmpz_set(res->coeffs+res_len, f->coeffs + i);
52+
53+
if (res->coeffs[res_len] == 0)
54+
continue;
55+
56+
mpoly_monomial_set(res->exps + N*res_len, f->exps + N*i, N);
57+
res_len++;
58+
}
59+
res->length = res_len;
60+
}

0 commit comments

Comments
 (0)