多倍長整数クラス 乗算 作成途中 [2日目]
すっごいコードになってしまいました。
睡眠不足&混乱気味ながら96bitのMAX値の掛け算は正しかったので、とりあえず・・・
多分もっと変わるかと思います。
BigUInt& BigUInt::operator*=(const BigUInt& p) { //int i, j; //int m, n; //unsigned long w[6]; //unsigned long long k, t; //m = n = 3; //for (i = 0; i < m; i++) { // w[i] = 0; //} //for (j = 0; j < n; j++) { // k = 0; // for (i = 0; i < m; i++) { // t = bits[i] * p.bits[j] + w[i + j] + k; // w[i + j] = (unsigned long)t; // k = t >> 16 >> 16; // k = t >> 32; // } // w[j + m] = (unsigned long)k; //} // //bits[0] = w[0]; //bits[1] = w[1]; //bits[2] = w[2]; unsigned long long u[3], v[3]; unsigned long long w[9]; unsigned long long s[2]; u[0] = bits[0]; u[1] = bits[1]; u[2] = bits[2]; v[0] = p.bits[0]; v[1] = p.bits[1]; v[2] = p.bits[2]; w[0] = u[0] * v[0]; w[1] = u[0] * v[1]; w[2] = u[0] * v[2]; w[3] = u[1] * v[0]; w[4] = u[1] * v[1]; w[5] = u[1] * v[2]; w[6] = u[2] * v[0]; w[7] = u[2] * v[1]; w[8] = u[2] * v[2]; w[1] = w[1] <<16<<16; w[2] = w[2] <<16<<16 <<16<<16; w[3] = w[3] <<16<<16; w[4] = w[4] <<16<<16 <<16<<16; w[5] = w[5] <<16<<16 <<16<<16 <<16<<16; w[6] = w[6] <<16<<16 <<16<<16; w[7] = w[7] <<16<<16 <<16<<16 <<16<<16; w[8] = w[8] <<16<<16 <<16<<16 <<16<<16 <<16<<16; s[0] = w[0] + w[1] + w[2] + w[3] + w[4] + w[5]; s[1] = w[6] + w[7] + w[8]; bits[0] = (unsigned long)s[0]; bits[1] = (unsigned long)(s[0] >> 16 >> 16 & 0xFFFFFFFF); bits[2] = (unsigned long)s[1] & 0xFFFFFFFF; return *this; }