1228{
1232 {
1236 }
1238 {
1242 }
1244 {
1247 }
1249 {
1253 }
1255 {
1258 }
1260 {
1263 }
1265 {
1268 }
1271
1272 if (best_level == 0)
1273 {
1277 }
1278
1281
1283
1284
1286 {
1291 }
1292
1296
1299 gcdcAcB=
gcd (cA, cB);
1302
1307
1308 gcdlcAlcB=
gcd (lcA, lcB);
1309
1311 int d0;
1312
1313 if (d == 0)
1314 {
1315 coF=
N (ppA*(cA/gcdcAcB));
1316 coG=
N (ppB*(cB/gcdcAcB));
1318 }
1319
1321
1322 if (d0 < d)
1323 d= d0;
1324
1325 if (d == 0)
1326 {
1327 coF=
N (ppA*(cA/gcdcAcB));
1328 coG=
N (ppB*(cB/gcdcAcB));
1330 }
1331
1333 CanonicalForm newtonPoly, coF_random_element, coG_random_element,
1334 coF_m, coG_m, ppCoF, ppCoG;
1335
1336 newtonPoly= 1;
1341 G_m= 0;
1343 bool fail= false;
1344 bool inextension= false;
1347 int bound1=
degree (ppA, 1);
1348 int bound2=
degree (ppB, 1);
1349 do
1350 {
1351 if (inextension)
1353 else
1355
1356 if (!fail && !inextension)
1357 {
1360 G_random_element=
1361 modGCDFp (ppA (random_element,
x), ppB (random_element,
x),
1362 coF_random_element, coG_random_element,
topLevel,
1363 list);
1365 "time for recursive call: ");
1366 DEBOUTLN (cerr,
"G_random_element= " << G_random_element);
1367 }
1368 else if (!fail && inextension)
1369 {
1372 G_random_element=
1373 modGCDFq (ppA (random_element,
x), ppB (random_element,
x),
1374 coF_random_element, coG_random_element, V_buf,
1377 "time for recursive call: ");
1378 DEBOUTLN (cerr,
"G_random_element= " << G_random_element);
1379 }
1380 else if (fail && !inextension)
1381 {
1386 int deg= 2;
1387 bool initialized= false;
1388 do
1389 {
1391 if (initialized)
1393 else
1395 inextension= true;
1396 initialized= true;
1397 fail= false;
1399 deg++;
1400 } while (fail);
1405 G_random_element=
1406 modGCDFq (ppA (random_element,
x), ppB (random_element,
x),
1407 coF_random_element, coG_random_element,
alpha,
1410 "time for recursive call: ");
1411 DEBOUTLN (cerr,
"G_random_element= " << G_random_element);
1412 }
1413 else if (fail && inextension)
1414 {
1417
1420 bool prim_fail= false;
1424
1425 if (V_buf3 !=
alpha)
1426 {
1428 G_m=
mapDown (G_m, prim_elem, im_prim_elem,
alpha, source, dest);
1429 coF_m=
mapDown (coF_m, prim_elem, im_prim_elem,
alpha, source, dest);
1430 coG_m=
mapDown (coG_m, prim_elem, im_prim_elem,
alpha, source, dest);
1431 newtonPoly=
mapDown (newtonPoly, prim_elem, im_prim_elem,
alpha,
1432 source, dest);
1433 ppA=
mapDown (ppA, prim_elem, im_prim_elem,
alpha, source, dest);
1434 ppB=
mapDown (ppB, prim_elem, im_prim_elem,
alpha, source, dest);
1435 gcdlcAlcB=
mapDown (gcdlcAlcB, prim_elem, im_prim_elem,
alpha, source,
1436 dest);
1437 lcA=
mapDown (lcA, prim_elem, im_prim_elem,
alpha, source, dest);
1438 lcB=
mapDown (lcB, prim_elem, im_prim_elem,
alpha, source, dest);
1440 i.getItem()=
mapDown (
i.getItem(), prim_elem, im_prim_elem,
alpha,
1441 source, dest);
1442 }
1443
1444 ASSERT (!prim_fail,
"failure in integer factorizer");
1445 if (prim_fail)
1446 ;
1447 else
1449
1452
1454 i.getItem()=
mapUp (
i.getItem(),
alpha, V_buf, prim_elem,
1455 im_prim_elem, source, dest);
1456 m=
mapUp (
m,
alpha, V_buf, prim_elem, im_prim_elem, source, dest);
1457 G_m=
mapUp (G_m,
alpha, V_buf, prim_elem, im_prim_elem, source, dest);
1458 coF_m=
mapUp (coF_m,
alpha, V_buf, prim_elem, im_prim_elem, source, dest);
1459 coG_m=
mapUp (coG_m,
alpha, V_buf, prim_elem, im_prim_elem, source, dest);
1460 newtonPoly=
mapUp (newtonPoly,
alpha, V_buf, prim_elem, im_prim_elem,
1461 source, dest);
1462 ppA=
mapUp (ppA,
alpha, V_buf, prim_elem, im_prim_elem, source, dest);
1463 ppB=
mapUp (ppB,
alpha, V_buf, prim_elem, im_prim_elem, source, dest);
1464 gcdlcAlcB=
mapUp (gcdlcAlcB,
alpha, V_buf, prim_elem, im_prim_elem,
1465 source, dest);
1466 lcA=
mapUp (lcA,
alpha, V_buf, prim_elem, im_prim_elem, source, dest);
1467 lcB=
mapUp (lcB,
alpha, V_buf, prim_elem, im_prim_elem, source, dest);
1468 fail= false;
1473 G_random_element=
1474 modGCDFq (ppA (random_element,
x), ppB (random_element,
x),
1475 coF_random_element, coG_random_element, V_buf,
1478 "time for recursive call: ");
1479 DEBOUTLN (cerr,
"G_random_element= " << G_random_element);
1481 }
1482
1486 else
1487 d0= 0;
1488
1489 if (d0 == 0)
1490 {
1491 if (inextension)
1493 coF=
N (ppA*(cA/gcdcAcB));
1494 coG=
N (ppB*(cB/gcdcAcB));
1496 }
1497
1498 if (d0 > d)
1499 {
1500 if (!
find (
l, random_element))
1501 l.append (random_element);
1502 continue;
1503 }
1504
1505 G_random_element= (gcdlcAlcB(random_element,
x)/
uni_lcoeff(G_random_element))
1506 *G_random_element;
1507
1508 coF_random_element= (lcA(random_element,
x)/
uni_lcoeff(coF_random_element))
1509 *coF_random_element;
1510 coG_random_element= (lcB(random_element,
x)/
uni_lcoeff(coG_random_element))
1511 *coG_random_element;
1512
1516 else
1517 d0= 0;
1518
1519 if (d0 < d)
1520 {
1522 newtonPoly= 1;
1523 G_m= 0;
1524 d= d0;
1525 coF_m= 0;
1526 coG_m= 0;
1527 }
1528
1530 H=
newtonInterp (random_element, G_random_element, newtonPoly, G_m,
x);
1531 coF=
newtonInterp (random_element, coF_random_element, newtonPoly, coF_m,
x);
1532 coG=
newtonInterp (random_element, coG_random_element, newtonPoly, coG_m,
x);
1534 "time for newton_interpolation: ");
1535
1536
1538 {
1540 if (gcdlcAlcB.
isOne())
1541 cH= 1;
1542 else
1556 {
1557 if (inextension)
1559 coF=
N ((cA/gcdcAcB)*ppCoF);
1560 coG=
N ((cB/gcdcAcB)*ppCoG);
1562 "time for successful termination Fp: ");
1563 return N(gcdcAcB*ppH);
1564 }
1566 "time for unsuccessful termination Fp: ");
1567 }
1568
1572 newtonPoly= newtonPoly*(
x - random_element);
1573 m=
m*(
x - random_element);
1574 if (!
find (
l, random_element))
1575 l.append (random_element);
1576 } while (1);
1577}
const CanonicalForm CFMap CFMap & N
CanonicalForm modGCDFq(const CanonicalForm &F, const CanonicalForm &G, CanonicalForm &coF, CanonicalForm &coG, Variable &alpha, CFList &l, bool &topLevel)
GCD of F and G over , l and topLevel are only used internally, output is monic based on Alg....
const CanonicalForm const CanonicalForm const CanonicalForm & coG
int myCompress(const CanonicalForm &F, const CanonicalForm &G, CFMap &M, CFMap &N, bool topLevel)
compressing two polynomials F and G, M is used for compressing, N to reverse the compression
static Variable chooseExtension(const Variable &alpha)
static CanonicalForm uni_content(const CanonicalForm &F)
compute the content of F, where F is considered as an element of
static CanonicalForm uni_lcoeff(const CanonicalForm &F)
compute the leading coefficient of F, where F is considered as an element of , order on is dp.
const CanonicalForm const CanonicalForm & coF
static CanonicalForm randomElement(const CanonicalForm &F, const Variable &alpha, CFList &list, bool &fail)
compute a random element a of , s.t. F(a) , F is a univariate polynomial, returns fail if there are...
static CanonicalForm FpRandomElement(const CanonicalForm &F, CFList &list, bool &fail)
static CanonicalForm newtonInterp(const CanonicalForm &alpha, const CanonicalForm &u, const CanonicalForm &newtonPoly, const CanonicalForm &oldInterPoly, const Variable &x)
Newton interpolation - Incremental algorithm. Given a list of values alpha_i and a list of polynomial...
bool terminationTest(const CanonicalForm &F, const CanonicalForm &G, const CanonicalForm &coF, const CanonicalForm &coG, const CanonicalForm &cand)
bool fdivides(const CanonicalForm &f, const CanonicalForm &g)
bool fdivides ( const CanonicalForm & f, const CanonicalForm & g )
#define ASSERT(expression, message)
CanonicalForm randomIrredpoly(int i, const Variable &x)
computes a random monic irreducible univariate polynomial in x over Fp of degree i via NTL/FLINT
CanonicalForm mapPrimElem(const CanonicalForm &primElem, const Variable &alpha, const Variable &beta)
compute the image of a primitive element of in . We assume .
CanonicalForm primitiveElement(const Variable &alpha, Variable &beta, bool &fail)
determine a primitive element of , is a primitive element of a field which is isomorphic to
static CanonicalForm mapDown(const CanonicalForm &F, const Variable &alpha, const CanonicalForm &G, CFList &source, CFList &dest)
the CanonicalForm G is the output of map_up, returns F considered as an element over ,...
static CanonicalForm mapUp(const Variable &alpha, const Variable &beta)
and is a primitive element, returns the image of
#define DEBOUTLN(stream, objects)
Variable FACTORY_PUBLIC rootOf(const CanonicalForm &, char name='@')
returns a symbolic root of polynomial with name name Use it to define algebraic variables
CanonicalForm getMipo(const Variable &alpha, const Variable &x)
void FACTORY_PUBLIC prune(Variable &alpha)
void setMipo(const Variable &alpha, const CanonicalForm &mipo)
template bool find(const List< CanonicalForm > &, const CanonicalForm &)
#define TIMING_END_AND_PRINT(t, msg)