我想测试一个整数是否是Pari-gp中的完美幂。测试sqrt(n)==floor(sqrt(n))
可以很好地用于测试正方形,但是对于其他所有功能都无效:sqrtn(n,k)==floor(sqrtn(n,k))
k >=3
。
我认为可能因为一个数字是实数而另一个是整数。仍然测试适用于正方形。我做错了什么?
答案 0 :(得分:3)
1)你应该直接使用ispower()
和ispower(, k)
来获得完美的第k个
权力。
2)factor
方法的问题在于,对于大输入,它会非常慢,而ispower
在多项式时间内运行。
3)自PARI以来,测试sqrtn(n,k)==floor(sqrtn(n,k))
不可靠
不保证精确舍入:即使sqrtn()的值是
在数学上是一个精确的整数,PARI可以返回任何实数,即a
比确切答案小一点或一点点。你会有点儿
使用round
比使用floor
更好。但它仍然不可靠,
这是一个或多或少有效的解决方案
y = round(sqrtn(n, k)); y^k == n
(提供realprecision
足够大)。但ispower从模块化开始
当数字不是第k个时,测试会使它变得非常快
功率。
答案 1 :(得分:2)
Prime权力只有一个基数(主要因素本身)的因子分解。因此,执行测试的更好方法是:
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 = 1 ^ k。
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
答案 2 :(得分:0)
你可以测试一下 压裂(sqrtn(261,3)+ epsilon)&lt; 2 *小量 其中epsilon是一些你认为可接受的非常小的数字,例如1E-15
我写的是为什么而不仅仅是“......&lt; epsilon”,因为有时你会得到4.0000000001,但你也可以得到3.9999999999。