///
/// 《小白学程序》第二十五课:大数(BigInteger)的Karatsuba乘法
/// Multiplies two bit strings X and Y and returns result as long integer
///
///
///
///
public static string karatsuba_multiply(string a, string b)
{
// Find the maximum of lengths of x and Y and make
// length of smaller string same as that of larger string
int n = Math.Max(a.Length, b.Length);
if (a.Length != n) a = a.PadLeft(n, '0');
if (b.Length != n) b = b.PadLeft(n, '0');
// Base cases
if (n == 0)
{
return "0";
}
else if (n == 1)
{
return ((a[0] - '0') * (b[0] - '0')).ToString();
}
else if (n <= 9)
{
// int max 21474 83647
// long max 9223 37203 68547 75807
return (ulong.Parse(a) * ulong.Parse(b)).ToString();
}
int fh = n / 2; // First half of string
int sh = n - fh; // Second half of string
// Find the first half and second half of first string.
string x1 = a.Substring(0, fh);
string x2 = a.Substring(fh);
// Find the first half and second half of second string
string y1 = b.Substring(0, fh);
string y2 = b.Substring(fh);
// Recursively calculate the three products of
// inputs of size n/2
string p1 = karatsuba_multiply(x1, y1);
string p2 = karatsuba_multiply(x2, y2);
//string P3 = Karatsuba(AddBitStrings(Xl, Xr), AddBitStrings(Yl, Yr));
string p3 = karatsuba_multiply(big_integer_plus(x1, x2), big_integer_plus(y1, y2));
// Combine the three products to get the final result.
//return P1 * (1L << (2 * sh)) + (P3 - P1 - P2) * (1L << sh) + P2;
int[] t1 = new int[sh];
string w1 = String.Join("", t1);
string v1 = p1 + w1 + w1;
string v2 = big_integer_subtract(p3, big_integer_plus(p1, p2)) + w1;
return big_integer_plus(v1, big_integer_plus(v2, p2));
}
2 代码格式
///
/// 《小白学程序》第二十五课:大数(BigInteger)的Karatsuba乘法
/// Multiplies two bit strings X and Y and returns result as long integer
///
///
///
///
public static string karatsuba_multiply(string a, string b)
{
// Find the maximum of lengths of x and Y and make
// length of smaller string same as that of larger string
int n = Math.Max(a.Length, b.Length);
if (a.Length != n) a = a.PadLeft(n, '0');
if (b.Length != n) b = b.PadLeft(n, '0');
// Base cases
if (n == 0)
{
return "0";
}
else if (n == 1)
{
return ((a[0] - '0') * (b[0] - '0')).ToString();
}
else if (n <= 9)
{
// int max 21474 83647
// long max 9223 37203 68547 75807
return (ulong.Parse(a) * ulong.Parse(b)).ToString();
}
int fh = n / 2; // First half of string
int sh = n - fh; // Second half of string
// Find the first half and second half of first string.
string x1 = a.Substring(0, fh);
string x2 = a.Substring(fh);
// Find the first half and second half of second string
string y1 = b.Substring(0, fh);
string y2 = b.Substring(fh);
// Recursively calculate the three products of
// inputs of size n/2
string p1 = karatsuba_multiply(x1, y1);
string p2 = karatsuba_multiply(x2, y2);
//string P3 = Karatsuba(AddBitStrings(Xl, Xr), AddBitStrings(Yl, Yr));
string p3 = karatsuba_multiply(big_integer_plus(x1, x2), big_integer_plus(y1, y2));
// Combine the three products to get the final result.
//return P1 * (1L << (2 * sh)) + (P3 - P1 - P2) * (1L << sh) + P2;
int[] t1 = new int[sh];
string w1 = String.Join("", t1);
string v1 = p1 + w1 + w1;
string v2 = big_integer_subtract(p3, big_integer_plus(p1, p2)) + w1;
return big_integer_plus(v1, big_integer_plus(v2, p2));
}