Matlab 在Pari GP中嵌套特定递归

Matlab 在Pari GP中嵌套特定递归,matlab,recursion,pari-gp,Matlab,Recursion,Pari Gp,各位! 我在Stackexchange上发布了一个类似的问题;它被移到了这里,可以在链接中找到:我试图在这篇文章中做一些类似的事情,但我发现Matlab不是这样做的地方。我将不得不使用Pari GP;在这一点上,没有两种方法 这本质上是我为自己做的一个编码项目;有效地数值计算四分函数的某种结构。我能够在MatLab中很好地编写代码;问题是,当我们处理像e^e^e^e^e^e^e^e^e这样的大数字时;这些短路在MatLab中实现。Pari GP对通常会导致溢出的数字有更好的理解;我现在完全明白为

各位!

我在Stackexchange上发布了一个类似的问题;它被移到了这里,可以在链接中找到:我试图在这篇文章中做一些类似的事情,但我发现Matlab不是这样做的地方。我将不得不使用Pari GP;在这一点上,没有两种方法

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

尽管如此,Matlab代码还是适用于小数字和精确的数字(位置合适的虚参数)。为了这个问题的完整性;matlab代码的github存储库是,这不是我们想要的代码;我进一步优化了它;这完全不是最新的。但就这个问题而言,这就足够了

现在,我不是最好的程序员。也许从09年起我就没编过程序了;但我仍然知道自己的路。但更多的是我有了编码的框架;而不是实际的语法。想象一下,熟悉法国哲学和法国写作;但在点咖啡的时候,你会说话结巴

关于这一点,我将不再拐弯抹角,开始讨论这个问题

如果我在Pari GP中定义一个函数
beta_函数
,并将其写成

beta_function(z,l,n) =
{
    out = 0;
    for(i=0,n-1,
        out = exp(out)/(exp(l*(n-i-z)) +1));
    out;
}
一切都很好,而且很有效。现在,MatLab中的
beta_函数
的代码没有太大区别。没有比这更复杂的了。正如我最初要求使用MatLab一样,我再次要求使用Pari GP。这是如何对函数进行编码的
tau_K(z,l,n,K)
;这是完全可行的。我只是错过了一些明显的东西

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

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的方向崩溃。对上帝诚实;我知道这只是因为我在调用下一次迭代的输出时犯了一些语法错误。我已经尝试了我能想到的一切。而这些教程似乎没有什么帮助。我几乎什么都试过了。在这一点上,我知道我在语法上遗漏了一些愚蠢的东西

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


再次感谢您深入到这个问题。

在提问时,如果您能为某些指定的参数提供预期的输出,这将有所帮助,否则很难测试。我不懂MATLAB,但你的函数可以用PARI编写:

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_函数
中,在
out=0附近放置
my()
非常重要。这使变量保持函数的局部性。如果不这样做,意味着
out
将是一个全局变量,并且可能会出现许多细微的错误

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

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

在MATLAB程序中有
/
。我不知道这意味着什么-我已替换为
/
,这只是普通的除法运算符


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

,则可以动态控制精度。谢谢!您建议的代码与我编写的代码非常接近。我想我明白我做错了什么。我没有将变量设置为local;当我试图构造tau_K时,我使用了相同的变量名;我不明白为什么它不起作用。这肯定是地方问题。非常感谢!