`umul', `umul_ff', `usquare', `usquare_ff', `utmul', `utmul_ff'
---------------------------------------------------------------

umul(P1,P2)
umul_ff(P1,P2)
     :: $B0lJQ?tB?9`<0$N9bB.>h;;(B

usquare(P1)
usquare_ff(P1)
     :: $B0lJQ?tB?9`<0$N9bB.(B 2 $B>h;;(B

utmul(P1,P2,D)
utmul_ff(P1,P2,D)
     :: $B0lJQ?tB?9`<0$N9bB.>h;;(B ($BBG$A@Z$j<!?t;XDj(B)

RETURN
     $B0lJQ?tB?9`<0(B

P1 P2
     $B0lJQ?tB?9`<0(B

D
     $BHsIi@0?t(B

   * $B0lJQ?tB?9`<0$N>h;;$r(B, $B<!?t$K1~$8$F7h$^$k%"%k%4%j%:%`$rMQ$$$F(B
     $B9bB.$K9T$&(B.

   * `umul()', `usquare()', `utmul()' $B$O(B $B78?t$r@0?t$H8+$J$7$F(B,
     $B@0?t78?t$NB?9`<0$H$7$F@Q$r5a$a$k(B.  $B78?t$,M-8BBN(B GF(p)
     $B$N85$N>l9g$K$O(B, $B78?t$O(B 0 $B0J>e(B p $BL$K~$N@0?t$H8+$J$5$l$k(B.

   * `umul_ff()', `usquare_ff()', `utmul_ff()' $B$O(B,
     $B78?t$rM-8BBN$N85$H8+$J$7$F(B, $BM-8BBN>e$NB?9`<0$H$7$F(B $B@Q$r5a$a$k(B.
     $B$?$@$7(B, $B0z?t$N78?t$,@0?t$N>l9g(B,
     $B@0?t78?t$NB?9`<0$rJV$9>l9g$b$"$k$N$G(B, $B$3$l$i$r8F$S=P$7$?7k2L(B
     $B$,M-8BBN78?t$G$"$k$3$H$rJ]>Z$9$k$?$a$K$O(B $B$"$i$+$8$a(B `simp_ff()'
     $B$G78?t$rM-8BBN$N85$KJQ49$7$F$*$/$H$h$$(B.

   * `umul_ff()', `usquare_ff()', `utmul_ff()' $B$O(B, GF(2^n)
     $B78?t$NB?9`<0$r0z?t$K<h$l$J$$(B.

   * `umul()', `umul_ff()' $B$N7k2L$O(B P1, P2 $B$N@Q(B, `usquare()',
     `usquare_ff()' $B$N7k2L$O(B P1 $B$N(B 2 $B>h(B, `utmul()', `utmul_ff()'
     $B$N7k2L$O(B P1, P2 $B$N@Q(B $B$N(B, D $B<!0J2<$NItJ,$H$J$k(B.

   * $B$$$:$l$b(B, `set_upkara()' (`utmul', `utmul_ff' $B$K$D$$$F$O(B
     `set_uptkara()') $B$GJV$5$l$kCM0J2<$N<!?t$KBP$7$F$ODL>o$NI.;;(B
     $B7A<0$NJ}K!(B, `set_upfft()' $B$GJV$5$l$kCM0J2<$N<!?t$KBP$7$F$O(B
     Karatsuba $BK!(B, $B$=$l0J>e$G$O(B FFT$B$*$h$SCf9q>jM>DjM}$,MQ$$$i$l$k(B.
     $B$9$J$o$A(B, $B@0?t$KBP$9$k(B FFT $B$G$O$J$/(B, $B==J,B?$/$N(B 1 $B%o!<%I0JFb$NK!(B
     MI $B$rMQ0U$7(B, P1, P2 $B$N78?t$r(B MI $B$G3d$C$?M>$j$H$7$?$b$N$N@Q$r(B, FFT
     $B$G7W;;$7(B, $B:G8e$KCf9q>jM>DjM}$G9g@.$9$k(B. $B$=$N:](B, $BM-8BBNHG$N4X?t$K(B
     $B$*$$$F$O(B, $B:G8e$K4pACBN$rI=$9K!$G3F78?t$N>jM>$r7W;;$9$k$,(B, $B$3$3$G$O(B
     Shoup $B$K$h$k%H%j%C%/(B `[Shoup]' $B$rMQ$$$F9bB.2=$7$F$"$k(B.

     [176] load("fff")$
     [177] cputime(1)$
     0sec(1.407e-05sec)
     [178] setmod_ff(2^160-47);
     1461501637330902918203684832716283019655932542929
     0sec(0.00028sec)
     [179] A=randpoly_ff(100,x)$
     0sec(0.001422sec)
     [180] B=randpoly_ff(100,x)$
     0sec(0.00107sec)
     [181] for(I=0;I<100;I++)A*B;
     7.77sec + gc : 8.38sec(16.15sec)
     [182] for(I=0;I<100;I++)umul(A,B);
     2.24sec + gc : 1.52sec(3.767sec)
     [183] for(I=0;I<100;I++)umul_ff(A,B);
     1.42sec + gc : 0.24sec(1.653sec)
     [184] for(I=0;I<100;I++)usquare_ff(A);
     1.08sec + gc : 0.21sec(1.297sec)
     [185] for(I=0;I<100;I++)utmul_ff(A,B,100);
     1.2sec + gc : 0.17sec(1.366sec)
     [186] deg(utmul_ff(A,B,100),x);
     100

$B;2>H(B
     *Note `set_upkara set_uptkara set_upfft': set_upkara set_uptkara
     set_upfft, *Note `kmul ksquare ktmul': kmul ksquare ktmul.

