从Pyhon(ctypes)向PARI / GP发送多项式

问题描述 投票:0回答:1

我想从Python调用nfroots({nf}; x)PARI/GP函数。 (see function no 3.13.135.on page 371 in this link:),但是问题是,我无法发送需要发送的代数表达式或多项式,例如,x^2-7x+12,这是gp可以处理四次方的一个非常简单的示例多项式:

> V = readvec("coeff.txt");
> print(V)
[1,-7,12]
> P = Pol(V);  # I get following error when I use Pol in my code:    func=self._FuncPtr((name_or_ordinal, self)) AttributeError: function 'pol' not found 
> print(P)
x^2 -7*x +12
> print(nfroots(,P))
>4, 3

Stephan Schlecht (click here)的答案中,我设法写-

from ctypes import *
pari = cdll.LoadLibrary("C:\\Program Files\\Pari64-2-11-3\\libpari.dll")

pari.stoi.restype = POINTER(c_long)
pari.cgetg.restype = POINTER(POINTER(c_long))

pari.nfroots.restype = POINTER(POINTER(c_long))


pari.pari_init(2 ** 19, 0)

def t_vec(numbers):
    l = len(numbers) + 1
    p1 = pari.cgetg(c_long(l), c_long(10)) #t_POL    =  10,
    for i in range(1, l):
        p1[i] = pari.stoi(c_long(numbers[i - 1]))
    return p1

def main():    
    h = "x^2-7x+12"
    res = pari.nfroots(t_vec(h))  
for i in range(1, len(res)):
         print(pari.itos(res[i]))
if __name__ == '__main__':
    main()

[请注意,有创建PARI对象的特定过程(请参阅Stephan Schlecht的答案),我更改了t_POL = 10的值,但是代码不起作用,如何执行上面的PARI / GP代码来自python吗?

python-3.x ctypes pari
1个回答
0
投票

一个解决方案可能是:

  • 使用gtopoly,返回类型为POINTER(c_long)
  • nfroots的返回类型为POINTER(POINTER(c_long))
  • .pari_printf输出结果

代码

from ctypes import *

pari = cdll.LoadLibrary("libpari.so")

pari.stoi.restype = POINTER(c_long)
pari.cgetg.restype = POINTER(POINTER(c_long))
pari.gtopoly.restype = POINTER(c_long)
pari.nfroots.restype = POINTER(POINTER(c_long))

(t_VEC, t_COL, t_MAT) = (17, 18, 19)  # incomplete
precision = c_long(38)

pari.pari_init(2 ** 19, 0)


def t_vec(numbers):
    l = len(numbers) + 1
    p1 = pari.cgetg(c_long(l), c_long(t_VEC))
    for i in range(1, l):
        p1[i] = pari.stoi(c_long(numbers[i - 1]))
    return p1


def main():
    V = (1, -7, 12)
    P = pari.gtopoly(t_vec(V), c_long(-1))
    res = pari.nfroots(None, P)
    pari.pari_printf(bytes("%Ps\n", "utf8"), res)


if __name__ == '__main__':
    main()

Test

如果运行程序,您将在调试控制台中获得所需的输出:

[3, 4]
© www.soinside.com 2019 - 2024. All rights reserved.