@@ -2190,7 +2190,7 @@ bvt bv_utilst::unsigned_schoenhage_strassen_multiplier(
2190
2190
bvt b = a;
2191
2191
PRECONDITION (a.size () == b.size ());
2192
2192
2193
- // Running examples : we want to multiple 213 by 15 as 8- or 9-bit integers.
2193
+ // Running example : we want to multiply 213 by 15 as 8- or 9-bit integers.
2194
2194
// That is, we seek to multiply 11010101 (011010101) by 00001111 (000001111).
2195
2195
// ^bit 7 ^bit 0
2196
2196
// The expected result is 123 as both an 8-bit and 9-bit result (001111011).
@@ -2245,8 +2245,10 @@ bvt bv_utilst::unsigned_schoenhage_strassen_multiplier(
2245
2245
{
2246
2246
a_rho.emplace_back (
2247
2247
a_ext.begin () + i * chunk_size, a_ext.begin () + (i + 1 ) * chunk_size);
2248
+ std::cerr << " a_rho[" << i << " ]: " << beautify (a_rho.back ()) << std::endl;
2248
2249
b_sigma.emplace_back (
2249
2250
b_ext.begin () + i * chunk_size, b_ext.begin () + (i + 1 ) * chunk_size);
2251
+ std::cerr << " b_sigma[" << i << " ]: " << beautify (b_sigma.back ()) << std::endl;
2250
2252
}
2251
2253
// For our example we now have
2252
2254
// a_rho = [ 0101, 1101, 0000, ..., 0000 ]
@@ -2268,11 +2270,13 @@ bvt bv_utilst::unsigned_schoenhage_strassen_multiplier(
2268
2270
++rho)
2269
2271
{
2270
2272
const std::size_t sigma = tau - rho;
2273
+ std::cerr << " Inner multiplication a_" << rho << " * b_" << sigma << std::endl;
2271
2274
gamma_tau[tau] = add (
2272
2275
gamma_tau[tau],
2276
+ zero_extension (
2273
2277
unsigned_multiplier (
2274
- zero_extension (a_rho[rho], 3 * n + 5 ),
2275
- zero_extension (b_sigma[sigma], 3 * n + 5 ) ));
2278
+ zero_extension (a_rho[rho], chunk_size * 2 ),
2279
+ zero_extension (b_sigma[sigma], chunk_size * 2 )), 3 * n + 5 ));
2276
2280
}
2277
2281
}
2278
2282
// For our example we obtain
@@ -2284,6 +2288,7 @@ bvt bv_utilst::unsigned_schoenhage_strassen_multiplier(
2284
2288
c_tau.reserve (num_chunks);
2285
2289
for (std::size_t tau = 0 ; tau < num_chunks; ++tau)
2286
2290
{
2291
+ std::cerr << " gamma_tau[" << tau << " ]: " << beautify (gamma_tau[tau]) << std::endl;
2287
2292
c_tau.push_back (add (gamma_tau[tau], gamma_tau[tau + num_chunks]));
2288
2293
CHECK_RETURN (c_tau.back ().size () >= address_bits (num_chunks) + 1 );
2289
2294
c_tau.back ().resize (address_bits (num_chunks) + 1 );
@@ -2292,6 +2297,10 @@ bvt bv_utilst::unsigned_schoenhage_strassen_multiplier(
2292
2297
// For our example we obtain
2293
2298
// c_tau = [ 01011, 00011, 0... ]
2294
2299
2300
+ // XXX 19*19 seems ok up to here with
2301
+ // http://malte-leip.net/beschreibung_ssa.pdf,
2302
+ // https://de.wikipedia.org/wiki/Sch%C3%B6nhage-Strassen-Algorithmus
2303
+
2295
2304
// Compute z_j = c_j - c_{j + 2^n} (mod 2^(n + 2)) (mod 2^(n + 1) and c_{j +
2296
2305
// 2^(n - 1)} when m is even)
2297
2306
std::vector<bvt> z_j;
0 commit comments