public class factorize {
public static void f(int n) {
int i = 2;
while( n > 1) {
if (n%i == 0) {
System.out.println("Factors " + i);
n = n / i;
}
else {
i++;
}
}
}
你好,我在java中做了factorize的一个函数但是需要多次执行,我试着在网上看到一些定理,但结果是一样的。 你能告诉我一些算法尽可能快地执行这个分解吗?这段代码需要2分钟。
答案 0 :(得分:2)
试试这个:
public static void f(int n) {
int i = 2;
while(i*i <= n) {
if (n%i == 0) {
System.out.println("Factors " + i);
n = n / i;
}
else {
i++;
}
}
if (n > 1) {
System.out.println("Factors " + n);
}
}
这是有效的,因为您只能有一个大于sqrt(n)
的素数因子:如果您有两个素数因子,那么他们的产品将超过n
,因为sqrt(n)*sqrt(n) = n
。因此,检查这些内容就足够了,如果n > 1
,则剩余的n
是另一个主要因素。
注意: 2732983441203969650
是一个很大的数字,不适合int
。如果您希望算法适用,请考虑使用long
。请注意,它的平方根也非常大,因此算法可能仍然非常慢。对于如此大的数字,因子分解非常困难。您可以尝试的一种算法可能适用于64位数字的Pollard's Rho algorithm。
您可以在代码中优化的其他内容:
单独检查2
,然后仅按奇数检查可分性;
使用Sieve of Eratosthenes生成低于n
平方根的素数,并检查这些素数的可分性。