Math 变长s的有效乘法[概念]

Math 变长s的有效乘法[概念],math,language-agnostic,recursion,complexity-theory,Math,Language Agnostic,Recursion,Complexity Theory,编辑 所以我似乎“低估了”不同长度数字的含义。我甚至没有想到操作数有100位数长的情况。在这种情况下,我提出的算法肯定是无效的。我可能需要一个实现,它的复杂性取决于每个操作数中数字的多少,而不是它的数值,对吗 正如下面所建议的,我将研究Karatsuba算法 编写一个算法的伪代码,该算法接受两个任意长度的数字(作为字符串提供),并计算这些数字的乘积。使用有效的程序将任意长度的大数相乘。分析算法的效率 我决定采取(半)简单的方法,使用俄罗斯农民算法。它的工作原理如下: a * b = a/2 *

编辑

所以我似乎“低估了”不同长度数字的含义。我甚至没有想到操作数有100位数长的情况。在这种情况下,我提出的算法肯定是无效的。我可能需要一个实现,它的复杂性取决于每个操作数中数字的多少,而不是它的数值,对吗

正如下面所建议的,我将研究Karatsuba算法


编写一个算法的伪代码,该算法接受两个任意长度的数字(作为字符串提供),并计算这些数字的乘积。使用有效的程序将任意长度的大数相乘。分析算法的效率

我决定采取(半)简单的方法,使用俄罗斯农民算法。它的工作原理如下:

a * b = a/2 * 2b if a is even 
a * b = (a-1)/2 * 2b + a if a is odd
我的伪代码是:

rpa(x, y){
    if x is 1
        return y
    if x is even
        return rpa(x/2, 2y)
    if x is odd
        return rpa((x-1)/2, 2y) + y
}
我有3个问题:

  • 这对任意长度的数字有效吗?我用C实现了它,并尝试了不同长度的数字。在所有情况下,运行时间几乎都是即时的,因此很难从经验上判断
  • 我可以应用Master定理来理解复杂性吗。。。?
    • a=#递归中的子问题=1(所有状态中最多1个递归调用)
    • n/b=每个子问题的大小=n/1->b=1(问题大小不变…?)
    • f(n^d)=在递归调用=1->d=0之外完成的功(a为奇数时的加法)
    • a=1,b^d=1,a=b^d->复杂性在n^d*log(n)=log(n)
    • 这在逻辑上是合理的,因为我们在每一步都将问题减半,对吗
  • 我的教授提供任意长度的数字“作为字符串”是什么意思。为什么这样做
  • 提前多谢

    添加3):本机整数在表示大(或小)数时受到限制(例如32位或64位整数)。要表示任意长度的数字,您可以选择字符串,因为这样您就不受此限制。当然,问题是,您的算术单位并不是真正用来添加字符串的;-)

    add3):本机整数在表示多大(或多小)数字时受到限制(例如32位或64位整数)。要表示任意长度的数字,您可以选择字符串,因为这样您就不受此限制。当然,问题是,您的算术单位并不是真正用来添加字符串的;-)

    我的教授提供任意长度的数字“作为字符串”是什么意思。为什么这样做?

    这实际上改变了有关问题的一切(并使您的算法不正确)。 这意味着1234以1,2,3,4的形式提供,您不能直接对整数进行操作。你需要从加法、乘法和除法的角度来分析你的算法。 你应该期望除法比乘法贵一点,乘法比加法贵很多。因此,一个好的算法应该尽量减少除法和乘法的次数

    检查一下,(ps不要复制它,这不是你的老师想要的)是这个规范中最快的一个。

    我的教授提供任意长度的数字“作为字符串”是什么意思。为什么这样做?

    这实际上改变了有关问题的一切(并使您的算法不正确)。 这意味着1234以1,2,3,4的形式提供,您不能直接对整数进行操作。你需要从加法、乘法和除法的角度来分析你的算法。 你应该期望除法比乘法贵一点,乘法比加法贵很多。因此,一个好的算法应该尽量减少除法和乘法的次数


    检查一下,(ps不要复制它,这不是你老师想要的)是这个规范中最快的一个。

    他想给你数字作为字符串,因为你使用的任何语言的内置数据类型都被限制在某个最大大小。如果他想让你将1983475234586235587623586235875932485乘以2345988762359876235987236459823465998234659982346599823465998234659834,字符串是表示这些数字的好方法。我猜你目前的算法无法处理这些输入……你的教授的意思是数字可能太大,无法放入机器字中,因此它们必须以任意长度的ASCII字符串(大概是10进制)提供。例如,“1234567898765432111122223344445”。所以你的算法恐怕是不完整的。但是你也可以在字符串上使用俄罗斯农民算法——你只需要做更多的工作:-/哦,我明白了。有道理——感谢你澄清了这一点。肯定要重新考虑这一点……他想把数字作为字符串给你,因为你使用的任何语言的内置数据类型都被限制在某个最大大小。如果他想让你将1983475234586235587623586235875932485乘以2345988762359876235987236459823465998234659982346599823465998234659834,字符串是表示这些数字的好方法。我猜你目前的算法无法处理这些输入……你的教授的意思是数字可能太大,无法放入机器字中,因此它们必须以任意长度的ASCII字符串(大概是10进制)提供。例如,“1234567898765432111122223344445”。所以你的算法恐怕是不完整的。但是你也可以在字符串上使用俄罗斯农民算法——你只需要做更多的工作:-/哦,我明白了。有道理——谢谢你澄清这一点。肯定要重新考虑这一点……谢谢!我将重新思考使用哪种操作的问题,并看看Karatsuba…实际上,如果你能理解Karatsuba,你可以根据要求再次证明它的复杂性,你也可以使用它。Karatsuba的巨大资源,