Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ctypes从Python中的PARI/GP获取数组/向量_Python_Arrays_Vector_Ctype_Pari - Fatal编程技术网

使用Ctypes从Python中的PARI/GP获取数组/向量

使用Ctypes从Python中的PARI/GP获取数组/向量,python,arrays,vector,ctype,pari,Python,Arrays,Vector,Ctype,Pari,我已经编写了一个代码来比较sympy和PARI/GP的解决方案,以及如何从PARI/GP获取数组/向量 当我试图从PARI/GP函数nfroots返回向量res时,我得到了如下地址(见最后一行)—— res是来自PARI/C世界的元素。它是一个PARI整数的PARI向量(t_整数的t_向量)。Python不知道这一点 如果要在Python端进一步处理它,则必须对其进行转换。如果需要在Python和PARI/C世界之间交换数据,这通常是必需的 因此,如果您有一个在PARI/C端带有t_int的t_

我已经编写了一个代码来比较
sympy
PARI/GP
的解决方案,以及如何从PARI/GP获取数组/向量

当我试图从PARI/GP函数
nfroots
返回向量
res
时,我得到了如下地址(见最后一行)——


res
是来自PARI/C世界的元素。它是一个PARI整数的PARI向量(t_整数的t_向量)。Python不知道这一点

如果要在Python端进一步处理它,则必须对其进行转换。如果需要在Python和PARI/C世界之间交换数据,这通常是必需的

因此,如果您有一个在PARI/C端带有t_int的t_-VEC,如本例所示,您很可能希望将其转换为Python列表

一种可能的方法如下所示:

...
roots = pari.nfroots(None, P)

result = []
for i in range(1, pari.glength(roots) + 1):
    result.append(pari.itos(roots[i]))
return result
from ctypes import *
from sympy.solvers import solve
from sympy import Symbol

pari = cdll.LoadLibrary("libpari.dll")
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
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):
        #Changed c_long to c_float, but got no output
        p1[i] = pari.stoi(c_long(numbers[i - 1]))
    return p1


def Quartic_Comparison():
    x = Symbol('x')
    #a=0;A=0;B=1;C=-7;D=13/12 #PROBLEM 1
    a=0;A=0;B=1;C=-7;D=12
    #a=0;A=0;B=-1;C=-2;D=1
    solution=solve(a*x**4+A*x**3+B*x**2+ C*x + D, x)
    print(solution)
    V=(A,B,C,D)
    P = pari.gtopoly(t_vec(V), c_long(-1))
    res = pari.nfroots(None, P)

    print("elements as long (only if of type t_INT): ")
    for i in range(1, pari.glength(res) + 1):        
         print(pari.itos(res[i]))
    return res               #PROBLEM 2

f=Quartic_Comparison()
print(f)
...
roots = pari.nfroots(None, P)

result = []
for i in range(1, pari.glength(roots) + 1):
    result.append(pari.itos(roots[i]))
return result