如何在 GP 中计算和评估复合函数?

How to compute and evaluate composite function in GP?

我找到了制作复合函数的解决方法,但我相信应该有更好的方法来做到这一点:

? f = x^2
%1 = x^2
? g = x^3      
%2 = x^3
? x = g
%3 = x^3
? fog = eval(f) 
%4 = x^6
? x = 2
%5 = 2
? result = eval(fog)
%6 = 64

在这个方法中,我需要多次赋值x并且我不想使用eval函数。代码不可读和不可维护。

PARI/GP 支持匿名闭包。所以你可以像这样自己定义函数组合:

comp(f: t_FUNC, g: t_FUNC) = {
    h = (x) -> f(g(x))
};

然后您的代码可以转换为更具可读性的形式:

f(x) = x^2;
g(x) = x^3;

h = comp(f, g);
h(x)
? x^6

x = 2; h(x)
? 64

希望,这对您有所帮助。

  1. 您可以简化 Piotr 对

    的精彩回答
    comp(f, g) = x->f(g(x));
    

实际上,您不需要在 comp 函数本身中分配给(全局)变量 h。此外,单行语句不需要大括号,类型注释也不是必需的(旨在优化字节编译器输出或帮助 gp2c;在这种特定情况下它们没有帮助)。 最后,当只有一个参数时,参数列表周围的括号在闭包定义中是可选的,如此处的 (x)

  1. 我会修改示例如下

    f(x) = x^2;
    g(x) = x^3;
    h = comp(f, g);
    
    ? h('x)     \ note the backquote
    %1 = x^6
    ? h(2)
    %2 = 64
    

'x 中的反引号确保我们使用 正式 变量 x 而不是分配给具有该名称的 GP 变量的任何值。对于第二个例子,2不需要赋值给x,我们可以直接调用h(2)

P.S。形式变量和 GP 变量之间的混淆很不幸,但对于 xy 等短名称来说很常见。引号运算符的引入是为了避免 kill 变量。在更复杂的函数中,系统地键入 'x 而不是 x 可能会很麻烦。避免这种情况的惯用结构是 my(x = 'x)。这确保 x GP 变量真正引用当前作用域中的正式变量。