给定一个32位正整数,请对其进行因数分解,找出是哪两个素数的乘积

正在学习Java正确性不保证

1,题目:囿1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数都是多少?

程序分析:可填在百位、十位、个位的数字都是1、2、3、4组荿所有的排列后再去掉不满足条件的排列。

2,判断101-200之间有多少个素数并输出所有素数。

只能被1和它本身整除的自然数为素数(质数)

3,打印出所囿的“水仙花数”所谓“水仙花数”是指一个三位数,其各位 数字立方和等于该数本身例如:153是一个“水仙花数”,因为 153=1的三次方+5嘚三次方+3的三次方

4,将一个正整数分解质因数。例如:输入90,打印出90=233*5

对n进行分解质因数,应先找到一个最小的质数k然后按下述步骤完荿:
a)如果这个质数恰等于n,则说明分解质因数的过程已经结束
b) 如果n不等于i,i能被n整除则应打印出i的值,并用n除以i的商,作为新的正整数n,偅复执行第一步

提示:如果一个自然数能写成两个自然数的乘积,那么这两个自然数就叫作原来那个数的因数

5,求任意两个正整数的最夶公约数和(GCD)和最小公倍数(LCM)

辗转相除法的算法为:首先将 m除以 n(m>n)得余数 r,再用余数 r 去除原来的除数得新的余数,重复此过程直到余数为 0時停止此时的除数就是m 和 n的最大公约数。
求 m和 n的最小公倍数: m和 n的积除以(m和 n 的最大公约数)

6,求1000以内的完全数

若一个自然数,恰好与除去它夲身以外的一切因数的和相等这种数叫做完全数。
先计算所选取的整数a(a的取值1~1000)的因数将各因数累加于m,若m等于a则可确认a为完全数

}

数论是最原始的两个分支即与,保留下来的问题传统的几何学已经凋零,所有的问题都得到解决而传统的算术却积累了越来越多的问题,成为难以穿越的密林过詓被认为是纯粹数学的,是专门研究的性质正整数按乘法性质划分,可以分成“素数”“合数”,“1”素数产生了很多一般人也能悝解而又悬而未解的问题,如很多问题虽然形式上十分初等,但事实上却要用到许多艰深的数学知识这一领域的研究从某种意义上推動了数学的发展,催生了大量的新思想和新方法

数论从早期到中期跨越了1000—2000年,在接近2000年时间数论几乎是空白。中期主要指15-16世纪到19世紀是由费马,梅森欧拉,高斯勒让德黎曼,希尔伯特等人发展的

内容是寻找素数通项公式为主线的思想,开始由初等数论向和论轉变产生了越来越多的猜想无法解决,遗留 到20世纪许许多多的困难还是依赖素数通项公式,例如黎曼猜想素数公式如果找到一个素數通项公式,现在一些困难问题 就可以由解析数论转回到初等数论范围

借助 及 的技术来研究关于整数的问题,主要又可以分为 与 两类積性数论借由研究积性生成函数的性质来探讨质数分布的问题,其中 与 为这个领域中最著名的古典成果加性数论则是研究整数的加法分解之可能性与表示的问题, 是该领域最著名的课题此外例如 、 等等都是属于这个范畴的重要议题。
引申 的话题关于 的研究,主要的研究目标是为了更一般地解决 的问题而为了达到此目的,这个领域与 之间有相当关联比如 (class
研究有理系数多变量方程组的有理点,其结構(主要是个数)和该方程组对应的代数簇的几何性质之间的关系有名的 、 、 ,和千禧年大奖难题中的 都属此类
主要在于透过几何观點研究整数(在此即格子点)的分布情形。最著名的定理为
借助电脑的 帮助数论的问题,例如素数测试和 等和 息息相关的话题
研究数嘚超越性,其中对于 与特定的Zeta函数值之研究尤其令人感到兴趣
利用组合和机率的技巧,非构造性地证明某些无法用初等方式处理的复杂結论这是由 开创的思路。

 筛选法的思路是:

     要求10000以内的素数把1-10000都列出来,1不是素数划掉;2是素数,所有2的倍数都不是素数划掉;取出下一个幸存的数,划掉它的所有倍数;直到所有素数找完为止

     唯一质因子分解定理:任意一个合数a仅能以一种方式,写成如下的乘積形式:

    素因子的分解技巧:首先a的某两个素因子不可能同时大于sqrt(a)这样,先用筛选法求出sqrt(a)以内的所有素数然后用a依次去mod这些素数,若能整除则找到素因子,将素因子去掉再继续找。最后若a>1则a也是它的素因子。

题意:给出任意一个正整数n(n<=10^6)根据哥德巴赫猜想:任意┅个不小于6的整数,都可以表示为两个奇素数之和问虽任意整数是否满足这个猜想。

解:筛选法将n以内的所有素数都求出来若a是素数,判断n-a是否为素数若找到一组不满足,则答案为否定

题意:给一个数n(n<=10^7),求最小的m>n使得m的素因子每一位上的数的和 == m的每一位上的数的囷。

解:显然这题就是要分解素因子先求10^4以内的素数,再用素因子分解然后判断。


}

给定一个小于2^54的整数判断该数昰不是素数,如果是素数的话输出“Prime”,否则输出该数的最小的素因子熟悉的有关素数的算法在这道题看来都还是太弱了,所以得额外的找方法来解决

应用到的两个重要算法是Rabin-Miller强伪素数测试和Pollard ?因数分解算法。前者可以在 的时间内以很高的成功概率判断一个整数是否昰素数后者可以在最优 的时间内完成合数的因数分解。这两种算法相对于试除法都显得比较复杂本文试图对这两者进行简单的阐述,說明它们在32位计算机上限制在64位以内的条件下的实现中的细节下文提到的所有字母均表示整数。

Rabin-Miller强伪素数测试的基本思想来源于如下的Fermat尛定理:
如果p是一个素数则对任意a有 (a^p)%p=a。特别的如果p不能整除a,则还有(a^(p-1))%p=1
利用Fermat小定理可以得到一个测试合数的有力算法:对n>1,选择a>1计算(a^(n-1))%n,若结果不等于1则n是合数若结果等于1则n可能是素数,并被称为一个以a为基的弱可能素数(weak probable prime base aa-PRP);若n是合数,则又被称为一个以a为基的伪素数(pseudoprime)

考虑素数的这样一个性质:若n是素数,则1对模n的平方根只可能是1和-1 因此a^(n-1) 对模n的平方根 a^((n-1)/2)也只可能是1和-1 。如果(n-1)/2本身还是一个偶数我们可以再取一次平方根……将这些写成一个算法:

Jr.证明了对任意a>1都存在无穷多个a-SPRP)。但由于不存在“强Carmichael数”(任何合数n都存在一个基a試之不是a-SPRP)我们可以组合多个测试来产生有力的测试,以至于对足够小的n可以用来证明其是否素数

取前k个素数为基,并用 来表示以前k個素数为基的强伪素数Riesel在1994年给出下表:

考虑到64位二进制数能表示的范围,只需取前9个素数为基则对小于φ8 的所有大于1的整数测试都是囸确的;对大于或等于 φ8并小于2^64 的整数测试错误的概率不超过1/(2^18) 。

Rabin-Miller强伪素数测试的核心是幂取模(即计算 )(a^s)%n计算幂取模有以下的 O(log n)算法(以Sprache偽代码语言描述):
这个算法在32位计算机上实现的难点在于指令集和绝大部分编程语言的编译器都只提供了32位相乘结果为64位的整数乘法,浮点运算由于精度的问题不能应用于这里的乘法唯一解决办法是模仿一些编译器内建的64位整数乘法来实现两个无符号64位相乘结果为128位的塖法。这个乘法可以将两个乘数分别分割成两个32位数来实现为方便乘法之后的取模运算,运算结果应当用连续的128个二进制位来表示以丅是其伪代码:

乘法之后的取模运算可以用浮点运算快速完成。具体做法是乘积的高64位和低64位分别先对除数取模然后再利用浮点单元合並取模。这里的浮点运算要求浮点单元以最高精度运算计算前应先将浮点单元控制字中的精度控制位设置为64位精度。为保证精度应当鼡80位浮点数实现此运算。伪代码如下:

至此Rabin-Miller强伪素数测试的核心已经全部实现。

Pollard-rho因数分解算法又称为Pollard Monte Carlo因数分解算法它的核心思想是:選取一个随机数a。再选一个随机数b检查 gcd(a-b,n)是否大于1。若大于1 gcd(a-b,n)就是n的一个因子。若不大于1再选取随机数c,检查 gcd(c-b,n)和 gcd(c-a,n)如此继续,直到找到n嘚一个非平凡因子

//速度快,而且可以判断 <2^63的数 //是素数返回true.(可能是伪素数但概率极小) int tol;//质因数的个数。数组下标从0开始 //对n进行素因子分解
}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信