sec_karatsuba

Niels Möller nisse at lysator.liu.se
Wed Feb 12 07:59:09 UTC 2014


bodrato at mail.dm.unipi.it writes:

> I tried to write a _sec_ version of Karatsuba multiplication. It is not
> intended for 5.2, of course, but it is ready and I like to share it. It is
> attached.

Cool.

> It obviously is slower than the non_sec toom22, but not terribly:
>
> 18        0.000000635       #0.9079        1.0035
> 19        0.000000677       #0.9722        1.0510
> 20        0.000000761       #0.8829        0.9771
> 21        0.000000833       #0.9291        0.9859

So threshold around 20 limbs, or 1280 bits. So 4096-bit rsa (with
2048-bit secret primes) is one potential application.

> I used evaluation in +1 instead of -1, to avoid branches due to the
> sign,

For the -1 point, one could use mpn_sub + mpn_cnd_neg to compute
|a-b|. And then also conditonally negate and sign-extend the
corresponding product. I don't know what's best, it's a couple of
negations vs an extra limb in the product.

> By the way, if you have the time to look at the code and comment, I'll
> appreciate.

I haven't read it very carefully, so only one minor point, 

>   ASSERT (an >= bn);
> 
>   s = an >> 1;
>   n = an - s;
>   t = bn - n;
> 
>   ASSERT (mpn_sec_mul_itch (an, bn) >= 4*n + 4);
>   if (UNLIKELY (s + t <= n))
>     {
>       mpn_mul_basecase (rp, ap, an, bp, bn);
>       return;
>     }

I think I'd prefer to do the check for the too unbalanced case earlier,
and not rely on t being signed.

Regards,
/Niels

-- 
Niels Möller. PGP-encrypted email is preferred. Keyid C0B98E26.
Internet email is subject to wholesale government surveillance.


More information about the gmp-devel mailing list