* multiplication (e.g., @mpx_umul@) on large numbers, although
* more expensive on small ones.
*
* multiplication (e.g., @mpx_umul@) on large numbers, although
* more expensive on small ones.
*
- * The destination must be twice as large as the larger
- * argument. The scratch space must be twice as large as the
- * larger argument, plus the magic number @KARATSUBA_SLOP@.
+ * The destination must be three times as large as the larger
+ * argument. The scratch space must be five times as large as
+ * the larger argument.
mpx_umul(dv, dvl, av, avl, bv, bvl);
return;
}
mpx_umul(dv, dvl, av, avl, bv, bvl);
return;
}
/* --- Sort out the middle term --- */
{
mpw *bsv = sv + m + 1, *ssv = bsv + m + 1;
mpw *rdv = dv + m, *rdvl = rdv + 2 * (m + 2);
/* --- Sort out the middle term --- */
{
mpw *bsv = sv + m + 1, *ssv = bsv + m + 1;
mpw *rdv = dv + m, *rdvl = rdv + 2 * (m + 2);
UADD2(sv, bsv, av, avm, avm, avl);
UADD2(bsv, ssv, bv, bvm, bvm, bvl);
UADD2(sv, bsv, av, avm, avm, avl);
UADD2(bsv, ssv, bv, bvm, bvm, bvl);
mpx_kmul(rdv, rdvl, sv, bsv, bsv, ssv, ssv, svl);
else
mpx_umul(rdv, rdvl, sv, bsv, bsv, ssv);
mpx_kmul(rdv, rdvl, sv, bsv, bsv, ssv, ssv, svl);
else
mpx_umul(rdv, rdvl, sv, bsv, bsv, ssv);
if (avl == avm || bvl == bvm)
MPX_ZERO(rdv + m + 1, dvl);
else {
if (avl == avm || bvl == bvm)
MPX_ZERO(rdv + m + 1, dvl);
else {
mpx_kmul(sv, ssv, avm, avl, bvm, bvl, ssv, svl);
else
mpx_umul(sv, ssv, avm, avl, bvm, bvl);
mpx_kmul(sv, ssv, avm, avl, bvm, bvl, ssv, svl);
else
mpx_umul(sv, ssv, avm, avl, bvm, bvl);
mpx_kmul(sv, ssv, av, avm, bv, bvm, ssv, svl);
else
mpx_umul(sv, ssv, av, avm, bv, bvm);
mpx_kmul(sv, ssv, av, avm, bv, bvm, ssv, svl);
else
mpx_umul(sv, ssv, av, avm, bv, bvm);
mpx_kmul(d, dl, a, al, b, bl, s, sl);
if (!mpx_ueq(d, dl, c, cl)) {
mpx_kmul(d, dl, a, al, b, bl, s, sl);
if (!mpx_ueq(d, dl, c, cl)) {