【问题标题】:Karatsuba C++ ImplementationKaratsuba C++ 实现
【发布时间】:2013-11-19 09:47:36
【问题描述】:

我在实现 Karatsuba 算法时遇到了一些问题。我的项目限制我使用以下库:iostream、iomanip、cctype、cstring。此外,我仅限于使用整数内置类型和数组/动态数组来处理数字(只会输入无符号整数)。我已经构建了一个类来使用动态数组处理任意大小的整数。我需要实现一个将大整数相乘的函数,如果可能的话,我想使用 Karatsuba。我遇到的麻烦是如何分解大整数并进行算法中要求的乘法运算。我认为这应该递归完成。我希望有人能给我一个如何做到这一点的例子。

例如:

我有两个数字存储在动态数组中。假设他们是:

X = 123456789123456789123456789 Y = 987654321987654321987654321987654321

考虑到 unsigned int 类型的存储限制,Karatsuba 需要如何处理这个问题?任何帮助将不胜感激!

【问题讨论】:

  • 强加这种任意条件通常是一个不好的迹象。家庭作业,我想,和一个糟糕的老师?我建议无论如何都使用vector,让它工作,然后重新实现您需要的vector 中的位。 (我个人会称之为nonstd::vector<>,但这些老师不会得到提示)。作业与否,你应该展示你迄今为止尝试过的东西(使用 Karatsuba,而不是你的 <vector> 副本)。
  • 很久以前,我为我的“LargeInt”C++ 类搜索了一个快速乘法例程,但从未找到。我可能需要挖掘我的旧代码并实现它。

标签: c++ arrays algorithm


【解决方案1】:

如果您查看伪代码here,您可以对其稍作修改以与这样的数组一起使用:

procedure karatsuba(num1, num2)

    if (num1.Length < 2) or (num2.Length < 2) //Length < 2 means number < 10    
        return num1 * num2 //Might require another mult routine that multiplies the arrays by single digits

    /* calculates the size of the numbers */
    m = max(ceiling(num1.Length / 2), ceiling(num2.Length / 2))
    low1, low2 = lower half of num1, num2
    high1, high2 = higher half of num1, num2

    /* 3 calls made to numbers approximately half the size */
    z0 = karatsuba(low1,low2)
    z1 = karatsuba((low1+high1),(low2+high2))
    z2 = karatsuba(high1,high2)

    //Note: In general x * 10 ^ y in this case is simply a left-shift
    //      of the digits in the 'x' array y-places. i.e. 4 * 10 ^ 3
    //      results in the array x[4] = { 4, 0, 0, 0 }
    return (z2.shiftLeft(m*2)) + ((z1-z2-z0).shiftLeft(m)) + (z0)

如果您为数字数组定义了一个加法、减法和额外的个位数乘法例程,则该算法应该很容易实现(当然还有其他必需的例程,例如数字移位和数组拆分)。

因此,对于其他例程还有其他初步工作,但这就是 Karatsuba 例程的实现方式。

【讨论】:

【解决方案2】:

伪代码有错误,即代替

return (z2.shiftLeft(m)) + ((z1-z2-z0).shiftLeft(m/2)) + (z0) 

应该是

return (z2.shiftLeft(m*2)) + ((z1-z2-z0).shiftLeft(m)) + (z0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多