本网站由以下捐款支持:OEIS基金会.

用户对话:Stanislav Sykora

来自OeisWiki
跳转到:航行,搜索

为OEIS写入实际值

嗨,我刚刚看到你的实用程序,想发表评论。我喜欢为OEIS写入实际值功能。它有点像我的bfile文件我每天使用的功能。我在写作时学到了一件事bfile文件gp写文件的能力很差:尤其是每个文件命令打开文件,写入单个条目,然后再次关闭文件。因此,用10000次写入操作来编写一个10000个字节的bfile需要很长的时间——好吧,可能需要5-10秒,但比其他方法要长得多。

如果您对此感到困扰,我发现的解决方法是将多个条目连接在一起,这样我就可以编写大块(比如1000个术语)。这大大提高了速度。如果你的读写性能足够好,或者你足够耐心,当然你不需要这样。

此外,我认为删掉最后一个数字(可能是错误的)加上所有尾随的9(当然还有前一个数字)和尾随的0(也可能是可疑的)可能是一个好主意。因此,如果计算值为。。。3001但实际值是。。。2998 (3硫酸盐,对于复杂的计算来说,这不是一个不合理的错误)那么最后三项是虚假的。这样你就不会被诱惑留下坏数字。

查尔斯·格里特豪斯四世2013年11月7日01:31(UTC)

嗨,是的,当然可以改进。到目前为止,写入文件的几秒钟延迟(最多)并没有困扰我。至于后面的数字,因为我生成的文件包含提交OEIS所需的所有数据,因此需要手动操作,我认为对精度的担忧可能会留给用户来处理(例如,我通常指定一个精度,例如2020,然后只保留2000位数字。但是的,一旦我发现这些方面应该/可以自动化,我就会这么做。

四分之一限制

在另一个文件中,您可能会找到新函数兰伯托如果您运行的是2.6.1或更高版本(为什么不呢?)。对于收敛情况e^-e<x<e^(1/e),答案如下

我的(t=-log(x));朗伯特(t)/t

这是快速准确的。

查尔斯·格里特豪斯四世2013年11月7日02:01(UTC)

同意;事实上,我在脚本的注释中也写了同样的内容(请参阅文件)。说实话,由于lambertw(x)只出现在PARI 2.6.1中,我想为自己和用户保留使用这两种方法并进行比较的可能性(也许我是站在不怀疑新代码的一边)。因此,TetrationLimit总是做那些老掉牙的工作,忽略效率,但确保结果正确。它不是Lambert W.的替代品:-)

听起来不错。我只是想,如果你没听说过这个函数,我会把它提出来。(我看到CHANGES文件中甚至没有提到它,所以我给维护人员发了电子邮件,他们添加了它。)
我有一个向后兼容的梦想,那就是创建一个函数库来复制新函数,这样一个人就可以(比如)获取整个兼容性文件或几个函数,并使用为较新版本设计的程序。如果起始版本足够新,您甚至可以使用lex()版本()只加载所需的函数。但后来我意识到,让人们升级就更容易了。 :)
查尔斯·格里特豪斯四世2013年11月8日01:14(UTC)

与素数相关的函数

我希望你还没有厌倦我的评论!

您可能会发现这很有用,尤其是对于简单的函数:返回最终的计算结果,因此不需要在最后一行使用return()。所以不是

IsNotPrime(n)={return(!isprime(n));}

你可以使用

IsNotPrime(n)=!i素数(n)

请注意主要因素数量DistinctPrimeFactors数量已在GP:大美人欧米茄分别是。类似地IsMoebius非零(n)已存在:无发行人.

查尔斯·格里特豪斯四世2013年11月27日00:42(UTC)

你评论得越多,我就越高兴!老了,但还在学习。

固有GP功能的重复是一个愚蠢的疏忽。“return”风格将我归类为C++程序员,我就是这样。由于OEIS有压缩编码的特权,所以我也会在更简单的函数中这样做。今天将全部更新。

斯坦尼斯拉夫·西科拉2013年11月27日09:18(UTC)

我错误地复制了至少同样多的GP函数,没有计算我编写一个后来添加的函数的次数。我想我能做什么来帮助别人避免这种情况,那就更好了。
PARI是作为C库编写的,因此PARI/GP维护人员(和我一样)对C非常熟悉。这通常是一件好事,尽管它确实使调整到GP的功能方面(例如,应用、选择和新的|<-、运算符)变得有点困难。
查尔斯·格里特豪斯四世2013年11月28日17:44(UTC)

上一个质数/下一个质素

我建议你

PreviousPrime(n)=前prime(ceil(n)-1);

下面的素数(n)=下一素数(楼层(n)+1);

如果你碰巧给他们传递了一个非整数的值,那就“做正确的事情”。

查尔斯·格里特豪斯四世2013年12月15日04:30(UTC)

谢谢,天花板和地板都是个好主意,我今天就做。至于名称,我故意使用大写的样式,以避免与固有的PARI名称空间发生任何重叠(无需踩在其他人的脚下)。例如,“nextprime”函数已经存在,但它做的是>=而不是>(当参数是质数p时,它返回p)。因此,我将使用PrecPrime和SuccPrime或类似的东西。

我可以问你一个问题吗?作为一名C++程序员,尽管我一直没有时间,但我的手指都渴望得到一个PARI/GPIDE。例如,一个人不能复制和粘贴真的很遗憾。我相信过去有过一次尝试,但被放弃了(?)你知道还有其他人在做这件事吗?

斯坦尼斯拉夫·西科拉2013年12月15日09:41(UTC)

我使用带有语法高亮显示的文本编辑器,如下所示:
http://math.crg4.com/pari/highlight.html
您可以从gp复制和粘贴,但如果您在Windows中,则需要启用快速编辑模式。右键单击gp快捷方式,转到“选项”选项卡,然后单击“快速编辑模式”。(参见这里是屏幕截图.)这允许您通过用鼠标突出显示文本(并按Enter?)进行复制,然后通过右键单击进行粘贴。
我使用Linux,可以按照描述进行复制,并使用shift-control-V进行粘贴。
我不确定您在PARI/GP IDE中还需要什么其他功能,但我还是不太使用IDE。(有时我使用Geany或VisualStudio,但通常只是在Linux或Notepad++上使用gedit。)可能比编写整个IDE更容易的是找到一些开源IDE并添加对GP和PARI的支持。
查尔斯·格里特豪斯四世2013年12月15日16:22(UTC)

关于您的功能的更多信息

有关的更多评论文件:PrimesRelatedFunctions.txt文件:DigitBasedFunctions.txt自上次添加以来:

  • 最大素因子(n)重复两次。此外,您应该使用我()而不是本地()基本上无处不在:
最大PrimeFactor(n)={如果(n==1,返回(n));my(v=系数(n));v[#v[,1],1]};
  • 基本因子总和(n)可以类似地简化:
基本因子总和(n)={my(v=系数(n));总和(k=1,#v[,1],v[k,1]*v[k、2])};
  • 同样的简化适用于主要因素产品n(n).
  • 对于兰姆达(n,m)你应该(一如既往)使用我(),它还允许您给出变量的初始值。此外,您可以使用/=操作员:
λ(n,m)={my(结果=二项式(n,m));对于素数(p=1+m,n,结果/=p);结果};
  • 数字到数字(d,b)可以简化为subt():
数字ToNumber(d,b=10)=子(Pol(d),'x,b);
  • 类似的技巧适用于反转数字(n,b):
反转数字(n,b=10)=subst(Polrev(数字(n、b)),'x,b);
  • 我不知道你为什么用矢量DifferAt对于IsPalindrome(n,b)什么时候==效果一样好,但速度更快。我会的IsPalindome(n,b=10)=n==反向数字(n,b);.
  • 数字位数(n,b=10)=数字数(n,b);
  • sumdigits()取代您的数字总和,尽管数字产品仍然需要。
  • 奇偶校验(n)=hammingweight(n)%2

希望这些评论有用!

查尔斯·格里特豪斯四世2014年5月16日02:58(UTC)

查尔斯,非常感谢你的编辑帮助!现在是我进行系统编辑的时候了,我要合并你的所有评论(还有一些旧的还未处理)以及我的几个项目。你基本上认为,由于缺乏时间和其他兴趣,我没有完全理解PARI/GP,并且总是停留在能让我解决当前特定问题的最小深度。然而,由于这是公众的看法,这种方法并不十分合适。我将在下周末努力。

--斯坦尼斯拉夫·西科拉2014年5月16日07:14(UTC)

由于拖延,我完成了你推荐的大部分编辑工作。需要对脚本进行更多的修剪;正在进行的工作。在一些情况下,由于对PARI(仍在学习)的怀疑,我没有继续进行。请您尝试以下命令序列(在单独的行上):precprime(2)|precprim(1)|precprime(1)|。。。为什么precprime(1)返回各种整数;即使争论不合逻辑,这种行为是否应该被纠正?

--斯坦尼斯拉夫·西科拉2014年6月6日14:34(UTC)

基于数字的功能

关于的一些评论文件:DigitBasedFunctions.txt如果你不介意的话。

  • 数字到数字现在复制(新)函数来自数字没什么错,我只是想指出。如果重要的话,内置功能可能会更快。
  • IsReversedGE公司更容易写IsReversedGE(n,b=10)=反向数字(n,b)>=n;--不需要如果.
  • 对于数字总和数字产品有两个问题。首先,您实际上创建了两个词汇范围的变量k个循环外(从未使用)和k个在循环中。为了避免混淆,您不应该k个在下面我的第二,没有必要使用返回在这里;返回最后一行,因此触头(k=1,#d,d[k])更可取。
  • 灰度解码:如上所述,无需返回在最后一行(开发人员不鼓励这样做)。

查尔斯·格里特豪斯四世2014年10月16日03:35(UTC)

谢谢。我会关注它的。在我上周下载的2.7.1版本中,来自数字似乎不存在。我已经做了其他修改。

既然你是PARI/GP专家,我可以问你一个问题吗?到目前为止,我认为所有的内在函数(例如,复杂的erfc)都可以达到默认值(realprecision),减去大约六位数。但这真的是这样吗?不太确定,我总是通过大量测试,例如,加倍精度、比较,然后只保留一半的数字(到目前为止,这样的测试非常令人欣慰)。在我看来,在最新版本中,显示的数字处理更加动态,因此可能有一些其他想法,但我找不到任何明确的通用指南。

--斯坦尼斯拉夫·西科拉2014年10月16日09:28(UTC)

对,来自数字()非常新。
我认为,目标是任何单个函数调用都应精确到1以内ulp公司(一般来说,您最好的期望值是0.5ulp——您没有更好的精度。)复杂的函数有内置的错误边界,如果不能确定最后的数字,它们将通过单词截断结果。因此,您可能会得到一个低于\p1000的982位数字的答案,因为gp不信任最后一个单词。在极端情况下,它可能会删除多个单词。
所以,即使你在做一些复杂的事情,你也应该做好直到最后一句话。如果gp认为您在1000位时丢失了10位精度,那么它不会截断,因为截断会再丢失9位数字。
更为保守的是,对于高精度的工作,你可以保留两个保护字(约38位)。加倍是非常极端的,我不会走那么远(也许除了测试新功能)。
当然,一旦你开始在循环中编写自己的数字代码,所有的赌注都会落空。如果它设计得不好,你可能会在每次迭代中损失一点精度,最终导致垃圾。这里没有简单的方法——你需要了解数值分析。。。!
顺便说一句:如果你发现一个函数返回了一个不准确的结果,那很可能是一个bug和应该报告.
查尔斯·格里特豪斯四世2014年10月26日15:29(UTC)