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)である。