为OEIS写入实际值
嗨,我刚刚看到你的实用程序,想发表评论。我喜欢为OEIS写入实际值
功能。它有点像我的b文件
我每天使用的功能。我在写作时学到了一件事b文件
gp写文件的能力很差:尤其是每个文件写
命令打开文件,写入单个条目,然后再次关闭文件。因此,用10000次写入操作来编写一个10000个字节的bfile需要很长的时间——好吧,可能需要5-10秒,但比其他方法要长得多。
如果您对此感到困扰,我发现的解决方法是将多个条目连接在一起,这样我就可以编写大块(比如1000个术语)。这大大提高了速度。如果你的读写性能足够好,或者你足够耐心,当然你不需要这样。
此外,我认为删掉最后一个数字(可能是错误的)加上所有尾随的9(当然还有前一个数字)和尾随的0(也可能是可疑的)可能是一个好主意。因此,如果计算值为。。。3001但实际值是。。。2998 (3ulps公司,对于复杂的计算来说,这不是一个不合理的错误)那么最后三项是虚假的。这样你就不会被诱惑留下坏数字。
查尔斯·格里特豪斯四世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和SuckPrime或类似的东西。
我可以问你一个问题吗?作为一名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自上次添加以来:
-
最大PrimeFactor(n)
重复两次。此外,您应该使用我()
而不是本地()
基本上无处不在:
最大PrimeFactor(n)={如果(n==1,返回(n));my(v=系数(n));v[#v[,1],1]};
基本因子总和(n)={my(v=因子(n));sum(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=10)=subst(Pol(d),'x,b);
反转数字(n,b=10)=subst(Polrev(数字(n、b)),'x,b);
- 我不知道你为什么用
矢量DifferAt
对于IsPalindrome(n,b)
什么时候==
效果一样好,但速度更快。我会的IsPalindrome(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)