1. 程式人生 > >John M. Pollard快速分解質因數法

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;
}