我想测试一个整数在Pari-gp中是否是一个完美的幂。测试sqrt(n)==floor(sqrt(n))可以很好地测试正方形,但对于其他功能:sqrtn(n,k)==floor(sqrtn(n,k))和k >=3,它都会失败。
我想可能是因为一个数字是实数,另一个是整数。这个测试仍然适用于正方形。我做错了什么?
发布于 2012-04-18 03:55:07
素数幂的因子分解只涉及一个基数(素数因子本身)。因此,执行测试的更好方法是:
isPrimePower(x) = {
matsize(factor(x))[1]==1
}下面是对前10个数字的测试:
for(i=0,10,print(i,"->",isPrimePower(i)))
0->1 (yes, p^0)
1->0
2->1 (yes, 2^1)
3->1 (yes, 3^1)
4->1 (yes, 2^2)
5->1 (yes, 5^1)
6->0
7->1 (yes, 7^1)
8->1 (yes, 2^3)
9->1 (yes, 3^3)
10->0对于复合基,我必须假设你的意思是完美的幂因数成指数e >= 2,否则任何n= n^1。即使现在我们从1=1^k开始也有1的情况。
isPerfectPower(x) = {
local(e);
if(x==1, return(0));
factors = factor(x);
e = factors[1,2];
if(e < 2, return(0));
for(i=2,matsize(factors)[1],
if(factors[i,2] != e, return(0));
);
return(1);
}再来一次测试:
> for(i=1,20,print(i,"->",isPerfectPower(i)))
1->0
2->0
3->0
4->1
5->0
6->0
7->0
8->1
9->1
10->0
11->0
12->0
13->0
14->0
15->0
16->1
17->0
18->0
19->0
20->0发布于 2013-04-06 00:05:20
ispower(),而ispower(, k)则是完美的k次方。factor方法的问题是,对于大输入,它将非常慢,而ispower在多项式时间内运行。sqrtn(n,k)==floor(sqrtn(n,k))不可靠,因为PARI不保证精确舍入:即使sqrtn()的值在数学上是精确整数,PARI也可能返回比精确答案稍大或稍小的任何实数。使用round比使用floor要好一点。尽管它仍然不可靠,但这里有一个或多或少可行的解决方案Y= round(sqrtn(n,k));y^k == n
(前提是realprecision足够大)。但ispower是从模块化测试开始的,只要数字不是k次方,它就会变得非常快。
发布于 2012-12-22 09:02:07
您可以测试frac(sqrtn(261,3)+ epsilon ) < 2*epsilon,其中epsilon是您认为可以接受的某个非常小的数字,例如1E-15
我写它的原因不仅仅是"... < epsilon“,因为有时你会得到4.0000000001,但你也可能会得到3.9999999999。
https://stackoverflow.com/questions/10176738
复制相似问题