首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pari/GP将整数与实数进行比较

Pari/GP将整数与实数进行比较
EN

Stack Overflow用户
提问于 2012-04-16 23:08:51
回答 3查看 505关注 0票数 0

我想测试一个整数在Pari-gp中是否是一个完美的幂。测试sqrt(n)==floor(sqrt(n))可以很好地测试正方形,但对于其他功能:sqrtn(n,k)==floor(sqrtn(n,k))k >=3,它都会失败。

我想可能是因为一个数字是实数,另一个是整数。这个测试仍然适用于正方形。我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-18 03:55:07

素数幂的因子分解只涉及一个基数(素数因子本身)。因此,执行测试的更好方法是:

代码语言:javascript
复制
isPrimePower(x) = {
  matsize(factor(x))[1]==1
}

下面是对前10个数字的测试:

代码语言:javascript
复制
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的情况。

代码语言:javascript
复制
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);
}

再来一次测试:

代码语言:javascript
复制
> 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
EN

Stack Overflow用户

发布于 2013-04-06 00:05:20

  1. 你应该直接使用ispower(),而ispower(, k)则是完美的k次方。

  1. factor方法的问题是,对于大输入,它将非常慢,而ispower在多项式时间内运行。

  1. 测试sqrtn(n,k)==floor(sqrtn(n,k))不可靠,因为PARI不保证精确舍入:即使sqrtn()的值在数学上是精确整数,PARI也可能返回比精确答案稍大或稍小的任何实数。使用round比使用floor要好一点。尽管它仍然不可靠,但这里有一个或多或少可行的解决方案

Y= round(sqrtn(n,k));y^k == n

(前提是realprecision足够大)。但ispower是从模块化测试开始的,只要数字不是k次方,它就会变得非常快。

票数 3
EN

Stack Overflow用户

发布于 2012-12-22 09:02:07

您可以测试frac(sqrtn(261,3)+ epsilon ) < 2*epsilon,其中epsilon是您认为可以接受的某个非常小的数字,例如1E-15

我写它的原因不仅仅是"... < epsilon“,因为有时你会得到4.0000000001,但你也可能会得到3.9999999999。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10176738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档