Macaulay2 Engine
Loading...
Searching...
No Matches

◆ division_in_place()

bool DPoly::division_in_place ( int level,
TowerPolynomial & f,
const TowerPolynomial g,
TowerPolynomial & result_quot )

Definition at line 1015 of file dpoly.cpp.

1020{
1021 assert(g != 0);
1022 if (f == nullptr || f->deg < g->deg)
1023 {
1024 result_quot = nullptr;
1025 return true;
1026 }
1027 int shift = f->deg - g->deg;
1028 result_quot = alloc_poly_n(shift);
1029
1030 if (level == 0)
1031 {
1032 // TODO: this code seems completely wrong!??!! too?
1033 long *p = f->arr.ints;
1034 long *q = g->arr.ints;
1035 long leadcoeff = q[g->deg];
1036 long invlead = 1;
1037 if (leadcoeff != 1)
1038 {
1039 ZZp_INVERT(charac, invlead, leadcoeff);
1040 }
1041 for (int d = f->deg; shift >= 0; d--, shift--)
1042 {
1043 long a = p[d];
1044 if (a != 0)
1045 {
1046 ZZp_MULT(charac, a, invlead);
1047 result_quot->arr.ints[shift] = a;
1048 ZZp_NEGATE(charac, a);
1049 for (int j = 0; j <= g->deg; j++)
1050 ZZp_APXY(charac, p[shift + j], a, q[j]);
1051 }
1052 }
1053 reset_degree_0(f);
1054 return true;
1055 }
1056 else
1057 {
1058 // TODO: this code seems completely wrong!??!!
1059 TowerPolynomial *p = f->arr.polys;
1060 TowerPolynomial *q = g->arr.polys;
1061 TowerPolynomial leadcoeff = q[g->deg];
1062 TowerPolynomial invlead;
1063 if (is_one(level - 1, leadcoeff))
1064 invlead = leadcoeff;
1065 else
1066 {
1067 invlead = invert(level - 1, leadcoeff);
1068 if (invlead == nullptr) return false;
1069 }
1070 for (int d = f->deg; shift >= 0; d--, shift--)
1071 {
1072 TowerPolynomial a = p[d];
1073 if (a != nullptr)
1074 {
1075 TowerPolynomial b = mult(level - 1, invlead, a, true);
1076 result_quot->arr.polys[shift] = copy(level - 1, b);
1077 for (int j = 0; j <= g->deg; j++)
1078 {
1079 b = mult(level - 1, a, q[j], true);
1080 subtract_in_place(level - 1, p[j + shift], b);
1081 }
1082 }
1083 }
1084 reset_degree_n(level, f);
1085 return true;
1086 }
1087}
void subtract_in_place(int level, TowerPolynomial &f, const TowerPolynomial g)
Definition dpoly.cpp:794
static TowerPolynomial alloc_poly_n(int deg, TowerPolynomial *elems=nullptr)
Definition dpoly.cpp:265
static TowerPolynomial copy(int level, const TowerPolynomial f)
Definition dpoly.cpp:483
void reset_degree_n(int level, TowerPolynomial &f)
Definition dpoly.cpp:635
TowerPolynomial invert(int level, const TowerPolynomial a)
Definition dpoly.cpp:855
long charac
Definition dpoly.hpp:115
TowerPolynomial mult(int level, const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension)
Definition dpoly.cpp:846
void reset_degree_0(TowerPolynomial &f)
Definition dpoly.cpp:623
static bool is_one(int level, const TowerPolynomial f)
Definition dpoly.cpp:595
void ZZp_MULT(long charac, long &a, long b)
Definition dpoly.cpp:63
void ZZp_APXY(long charac, long &a, long b, long c)
Definition dpoly.cpp:49
void ZZp_INVERT(long charac, long &result, long b)
Definition dpoly.cpp:68
void ZZp_NEGATE(long charac, long &a)
Definition dpoly.cpp:48
int p

References alloc_poly_n(), charac, copy(), invert(), is_one(), mult(), p, reset_degree_0(), reset_degree_n(), subtract_in_place(), ZZp_APXY(), ZZp_INVERT(), ZZp_MULT(), and ZZp_NEGATE().

Referenced by remainder().