1164{
1165
1166
1167 TowerPolynomial v1, v2, v3;
1168 TowerPolynomial u1, u2, u3;
1169 TowerPolynomial q = nullptr;
1170
1171 v1 = nullptr;
1173 v3 =
copy(level, g);
1174
1176 u2 = nullptr;
1177 u3 =
copy(level, f);
1178
1179 if (v3 == nullptr || (u3 != nullptr && v3->deg > u3->deg))
1180 {
1184 }
1185
1186
1187
1188
1189
1190
1191#ifdef DEBUGGCD
1192 if (level == 1)
1193 {
1194 printf(
"u1 = %s\n",
to_string(level, u1));
1195 printf(
"u2 = %s\n",
to_string(level, u2));
1196 printf(
"u3 = %s\n",
to_string(level, u3));
1197
1198 printf(
"v1 = %s\n",
to_string(level, v1));
1199 printf(
"v2 = %s\n",
to_string(level, v2));
1200 printf(
"v3 = %s\n",
to_string(level, v3));
1201 }
1202#endif
1203
1204 while (v3 != nullptr)
1205 {
1207 {
1208
1216 result_u = nullptr;
1217 result_v = nullptr;
1218 return nullptr;
1219 }
1221 level,
1222 u3,
1223 v3);
1224
1225#ifdef DEBUGGCD
1226 if (level == 1)
1227 {
1228 printf(
"q = %s\n",
to_string(level, q));
1229 printf(
"u3 = %s\n",
to_string(level, u3));
1230 }
1231#endif
1232
1234 TowerPolynomial a =
mult(level, q, v1,
false);
1235 TowerPolynomial b =
mult(level, q, v2,
false);
1238
1239#ifdef DEBUGGCD
1240 if (level == 1)
1241 {
1242 printf(
"u1 = %s\n",
to_string(level, u1));
1243 printf(
"u2 = %s\n",
to_string(level, u2));
1244 printf(
"u3 = %s\n",
to_string(level, u3));
1245 }
1246#endif
1252 }
1253
1254#ifdef DEBUGGCD
1255 if (level == 1)
1256 {
1257 printf(
"u1 = %s\n",
to_string(level, u1));
1258 printf(
"u2 = %s\n",
to_string(level, u2));
1259 printf(
"u3 = %s\n",
to_string(level, u3));
1260 }
1261#endif
1262
1263
1264
1265
1268
1269 result_u = u1;
1270 result_v = u2;
1271 return u3;
1272}
static TowerPolynomial copy(int level, const TowerPolynomial f)
void add_in_place(int level, TowerPolynomial &f, const TowerPolynomial g)
TowerPolynomial mult(int level, const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension)
bool make_monic3(int level, TowerPolynomial &u1, TowerPolynomial &u2, TowerPolynomial &u3)
static void dealloc_poly(TowerPolynomial &f)
void negate_in_place(int level, TowerPolynomial &f)
static char * to_string(int level, const TowerPolynomial f)
TowerPolynomial division_in_place_monic(int level, TowerPolynomial &f, const TowerPolynomial g)
static TowerPolynomial from_long(int level, long c)
static void swap_poly(TowerPolynomial &f, TowerPolynomial &g)