John M. Pollard快速分解质因数法


1975年,John M. Pollard提出了一种新的算法,算法时间复杂度为O(n^1/4)。
求一个数分解质因数,要从最小的质数除起,一直除到结果为质数为止。分解质因数的算式的叫 短除法,和除法的性质差不多,还可以用来求多个个数的公因式:

  如24 
  2┖24(是短除法的符号) 
  2┖12 
  2┖6 
  3——3是质数,结束 
  得出24=2×2×2×3=2^3×3(m^n=m的n次方) 
  再如105 
  3┖105 
  5┖35 
  ----7——7是质数,结束 
  得出105=3×5×7

John M. Pollard算法思想就是短除法用的思想。

#include<stdio.h>
int main()
{
	int num = 24;//需要分解的数,根据数的大小选择类型
	int i = 2;
	for(i=2; i<=num/2; i++)
	{
		while(num >= i)
		{
			if(num % i == 0)//能被整除
			{
				printf("%d * ", i);//输出
				num /= i;//模仿短除法
			}
			else
				break;
		}
	}
	printf("%d\n", num);
return 0;}
输出:2 * 2 * 2 * 3

基本思想如上所述,具体程序需要自己改代码,比如选择数据类型,可能是long long类型,最后输出也要控制,比如num为8的时候会输出2 * 2 * 2 * 1,所以最后还得对num进行判断,如果是1则不要输出了

最后比较完整的程序:

#include<stdio.h>
int main()
{
	long long num;
	printf("please input a number:");
	scanf("%lld", &num);
	int i = 2;
	printf("%lld = ", num);
	for(i=2; i<=num/2; i++)
	{
		while(num >= i)
		{
			if(num % i == 0)//能被整除
			{
				if(num / i == 1)
					printf("%d\n", i);
				else
					printf("%d * ", i);
				num /= i;//模仿短除法
			}
			else
				break;
		}
		
	}
	if(num != 1)
		printf("%lld\n", num);
	return 0;
}

阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页