我已经编写了一段代码来比较sympy
和PARI/GP
的解决方案,无论我如何面对从PARI/GP获取数组/向量的问题
当我试图从PARI/GP函数nfroots
返回向量res
时,我得到了如下地址(见最后一行)——
[3, 4]
elements as long (only if of type t_INT):
3
4
<__main__.LP_LP_c_long object at 0x00000000056166C8>
如何从nfroots
获取res
作为向量/数组,以便像普通python向量/数组一样使用该数组
代码如下所示to download the libpari.dll file, click here-
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)
res
是来自PARI/C世界的元素。它是一个PARI整数的PARI向量(t_整数的t_向量)。Python不知道这一点如果要在Python端进一步处理它,则必须对其进行转换。如果需要在Python和PARI/C世界之间交换数据,这通常是必需的
因此,如果您有一个在PARI/C端带有t_int的t_-VEC,如本例所示,您很可能希望将其转换为Python列表
一种可能的方法如下所示:
相关问题 更多 >
编程相关推荐