算法讲义(2) -数论算法 I

本文探讨了数论算法中的两大核心问题:因式分解与素数判断。通过对比两种问题的难度,介绍了基本算术运算如加法和乘法的算法实现及复杂度分析,并提出了一些改进思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  
数论算法
本章的一个重点是讨论和比较两个著名的问题:
  • 因式分解(Factoring):给定一个数字N,将其表示成素数的乘积。
  • 素属性(Primality):给定一个数字N,判断它是否是素数。
因式分解是很困难的,到目前为止,最快的算法复杂度也是N的指数幂。而另一方面,我们却可以很快的判断出N是否是素数!今天,两个问题的这种特性成为当今信息安全的核心基础。
 
基本算术
 
1.1.1加法
我们很小就对加法计算了如指掌,但是这里还是花一些时间研究一下加法算法。加法中有一个基本的属性是:
            任何三个单位数字的和(sum)的长度至多有两位。
例如三个单位数字和的最大值是9+9+9=27,长度为两位数;二进制加法亦然。
 
这个简单的属性是加法计算的基础:只要两个数字的右端对齐,然后结果的每一位都将是两个单位数字和一位进位数字(如果有的话)的和,并且保证进位数字长度也是1。举个例子:
    进位 1     1 1 1
                 110 1 0 1 (53)
                 100 0 1 1 (35)
-----------------------------------
             1 0 11 0 0 0 (88)
 
问题:给定两个二进制数x,y,求它们的和的时间复杂度是多少?
假定x和y的长度都是n位,则x+y最多是n+1位,而每一位的计算时间是固定的,因此,整个计算时间是c0+c1*n,c0和c1是常数,计算复杂度为O(n)。
问题:有没有更快的算法?
对于加法来说,答案是否定的L,我们至少需要n次操作来读些x+y。
 
有些读者可能会有些疑惑:加法运算不是只需要一条指令就可以了吗?问题是这样的条件是数字长度限制在32位以内(对x86),如果操作对象是几百,甚至几千几万位长,我们就只能按位来计算了。
 
 
1.1.2乘法和除法
接下来乘法计算,乘法计算如下例所示:

 
如果x和y的长度都是n位,则会有n行中间结果,而中间结果的和最多有2n位。
 
计算n个中间结果的和的时间复杂度为:
O(n) + O(n) + … + O(n) n-1次
即O(n^2),显然比加法复杂度高了很多。
 
Al Khwarizmi还提出了另一种乘法算法,而且现在仍然在西方的一些国家中使用:首先,将两个乘数左右放置,如下面的例子所示,重复以下行为:将第一列数字整除2,结果写在下一行,然后将第二列数字乘2。重复计算直到第一列的数字减为1。最后移除(strike out)所有第一列数字为偶数的行,将剩余的第二列数字加起来即为乘法结果:

将这种算法用公式表示为:

  

下面是该算法的伪代码:

 
这个算法的复杂度依然是O(n^2),有没有更好的算法呢?答案是肯定的,我们将在以后继续讨论。
至于除法,整数x除以非零整数y,等同于求商(quotientq和余数(reminderr,使得x=y*q+r,并且r<y。其递归算法的伪代码表示如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值