mpMul 多倍長整数同士の乗算
void mpMul(int *ret, int *a, int *b);
ret (出力)多倍長整数同士の乗算の結果(a * b) a, b (入力)多倍長整数
なし
#define N 10000
void mpMul(int *ret, int *a, int *b)
{
int i, j;
int la, lb;
int *aa;
int ca = 1;
long x;
la = *a;
lb = *b;
for (i = la + lb; i > 0; i--) *(ret + i) = 0;
for (j = 1; j <= lb; j++) {
ca = 0;
for (i = 1, aa = a; i <= la; i++) {
x = *++aa;
x = x * *++b + *(ret + i + j - 1) + ca;
*(ret + i + j - 1) = x % N;
ca = x / N;
}
*(ret + i + j - 1) = ca;
}
*ret = (ca != 0) ? la + lb : la + lb - 1;
}
この方法では、bのn語をそれぞれaのm語に掛けるので、m*n回の繰り返し となる。したがって、計算に必要な時間はO(mn)である。