首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Pari-GP中嵌套特定的递归

在Pari-GP中嵌套特定的递归
EN

Stack Overflow用户
提问于 2021-05-02 12:37:04
回答 1查看 56关注 0票数 0

所有人!

我发布了一个类似的问题,最初是在Stackexchange上;它被移到了这里,可以在链接中找到:Declaring a functional recursive sequence in Matlab在这篇文章中我正试图做一些类似的事情,但我认为Matlab不适合这样做。我将不得不使用Pari-GP;在这一点上,没有两种方法。

这本质上是我为自己做的一个编码项目;它是为了有效地用数值计算Tetration函数的某个结构。我已经能够用MatLab很好地编写它;问题是,因为我们在MatLab中处理像e^e;这些短路这样的大数字。Pari-GP对通常会导致溢出的数字有更好的理解;我现在完全意识到为什么它一直被Tetration社区使用。

尽管如此,Matlab代码仍然适用于小数字和对它们有好处的数字(位置合理的虚构参数)。为了这个问题的完整性,matlab代码的github存储库是https://github.com/JmsNxn92/Recursive_Tetration,但这不是我们想要的代码;我已经进一步优化了它;这不是完全最新的。但对于这个问题来说,这就足够了。

现在,我不是最好的程序员。或许,我从09年起就没有编程过;但我仍然很熟悉。但这更多的是因为我有编码框架;而不是实际的语法。想象一下,我很熟悉法国哲学和法语写作,但在点咖啡时结结巴巴地说了一遍。

至于那件事,我不再拐弯抹角了,直接说正题吧。

如果我在Pari-GP中定义一个函数beta_function并将其编写为,

代码语言:javascript
复制
beta_function(z,l,n) =
{
    out = 0;
    for(i=0,n-1,
        out = exp(out)/(exp(l*(n-i-z)) +1));
    out;
}

一切都很好,而且还能正常工作。现在,MatLab中的beta_function代码并没有太大的不同。没有添加更复杂的东西。正如我最初要求的MatLab一样,我现在再次要求使用Pari-GP。这就是如何编写一个函数tau_K(z,l,n,k);,这是完全可行的。我只是遗漏了一些明显的东西。

下面是MatLab中tau_K(z,l,n,k)的代码。这里的一个友好的人解释了如何在MatLab中做到这一点;对于那些感兴趣的人,我事先并没有真正正确地定义递归。这是我正在使用的当前MatLab代码,

代码语言:javascript
复制
function f = tau_K(z,l,n,k)
    if k == 1
        f = -log(1+exp(-l*z));
        return
    end

    f = log(1 + tau_K(z+1,l,n,k-1)./beta_function(z+1,l,n)) - log(1+exp(-l*z));
end

问题很简单。如何在Pari-GP中定义这种递归;如何在Pari-GP中对其进行编码?

当我尝试直接翻译这段代码时,一切似乎都朝着返回值为0的方向崩溃了。老实说,我知道这只是因为我在调用输出到下一次迭代的方式上犯了一些语法错误。我已经试过我能想到的一切了。而且这些教程似乎也帮不上忙。我什么都试过了。在这一点上,我知道我在语法上漏掉了一些愚蠢的东西。

我只希望这里有人能帮我解释一下,就像我在幼儿园一样。我听说尾递归在这里很重要。如果是这样的话,我该如何编码呢?只需添加一个跟踪所有内容的变量?

再次,如果你进入这个问题的话,谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-03 07:53:15

当提出问题时,如果你能为一些特定的给定参数提供预期的输出,这将会有所帮助,否则很难测试。我不懂MATLAB,但你的函数可以用PARI写成:

代码语言:javascript
复制
beta_function(z,l,n)={
    my(out = 0);
    for(i=0,n-1,
        out = exp(out)/(exp(l*(n-i-z)) +1));
    out;
}

tau_K(z,l,n,k)={
    if(k == 1, 
      -log(1+exp(-l*z)), 
      log(1 + tau_K(z+1,l,n,k-1)/beta_function(z+1,l,n)) - log(1+exp(-l*z))
    )
}

beta_function中,将my()放在out = 0周围是很重要的。这使得变量对于函数来说是局部的。如果做不到这一点,就意味着out将成为一个全局变量,并且可能会出现许多细微的错误。

PARI是一种函数式编程语言,这意味着您通常不需要显式地为临时变量赋值。例如,MATLAB将返回一个值,这个值可以从tau_K函数返回(在MATLAB代码中,您可以将临时变量f赋值给它,但在PARI中,这并不是必需的)。

递归调用函数是没有问题的。在这种情况下,tau_K可以根据需要直接调用自身。

在MATLAB程序中,你有./。我不知道这是什么意思-我已经被/取代了,它只是一个普通的除法运算符。

在运行之前,您需要为数值运算设置一些精度。实现这一点的最简单方法是在PARI-GP提示符下输入\p100。(如果需要1000位小数精度,则为\p1000 )。如果您需要以高精度执行计算的某些部分和以较低精度执行的其他部分,或者如果精度需要依赖于n,则可以动态控制精度。

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

https://stackoverflow.com/questions/67353022

复制
相关文章

相似问题

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