从 Python 调用 PARI/GP

2024-05-18

我想打电话PARI/GP http://pari.math.u-bordeaux.fr/dochtml/gpman.html仅从Python计算函数nextprime(n)对于不同的n是我定义的。不幸的是我无法得到帕里蟒蛇 http://code.google.com/p/pari-python/安装,所以我想我只需使用命令行来调用它os.system在Python中。然而,我在手册页中看不到如何让 PARI/GP 在非交互模式下运行。有办法实现这一点吗?


您可以像这样将输入通过管道输入到 gp 的 stdin 中,使用-q消除冗长的标志:

senderle:~ $ echo "print(isprime(5))" | gp -q
1

然而,创建一个简单的 Python 扩展并允许您将字符串传递给 pari 的内部解析器并返回结果(作为字符串)并不困难。这是我前段时间写的一个简单版本,这样我就可以调用 pari 的实现APRT测试 https://stackoverflow.com/q/4752190/577088来自蟒蛇。您可以进一步扩展它以进行适当的转换等。

//pariparse.c

#include<Python.h>
#include<pari/pari.h>

static PyObject * pariparse_run(PyObject *self, PyObject *args) {
    pari_init(40000000, 2);
    const char *pari_code;
    char *outstr;

    if (!PyArg_ParseTuple(args, "s", &pari_code)) { return NULL; }
    outstr = GENtostr(gp_read_str(pari_code));
    pari_close();
    return Py_BuildValue("s", outstr);
}

static PyMethodDef PariparseMethods[] = {
    {"run", pariparse_run, METH_VARARGS, "Run a pari command."},
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC initpariparse(void) {
    (void) Py_InitModule("pariparse", PariparseMethods);
}

和安装文件:

#setup.py

from distutils.core import setup, Extension

module1 = Extension('pariparse',
                    include_dirs = ['/usr/include', '/usr/local/include'],
                    libraries = ['pari'],
                    library_dirs = ['/usr/lib', '/usr/local/lib'],
                    sources = ['pariparse.c'])

setup (name = 'pariparse',
       version = '0.01a',
       description = 'A super tiny python-pari interface',
       ext_modules = [module1])

然后只需输入python setup.py build构建扩展。然后你可以这样称呼它:

>>> pariparse.run('nextprime(5280)')
'5281'

我刚刚对此进行了测试,它通过 homebrew(在 OS X 上)提供的最新版本的 pari 为我进行了编译。嗯嗯!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Python 调用 PARI/GP 的相关文章