6

私が定義したさまざまなs の関数を計算するためだけに、Python からPARI/GPを呼び出したいと思います。残念ながら、pari-pythonをインストールすることができないので、Python 経由でコマンド ラインを使用して呼び出すだけでよいと考えました。ただし、マニュアル ページを参照しても、PARI/GP を非対話モードで実行する方法がわかりません。これを達成する方法はありますか?nextprime(n)nos.system

4

3 に答える 3

6

-qフラグを使用して冗長性を潰すと、このようにgpのstdinに入力をパイプできます。

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

ただし、文字列をpariの内部パーサーに渡し、結果を(文字列として)返すことができる単純なPython拡張機能を作成することはそれほど難しくありません。これは、PythonからpariのAPRTテストの実装を呼び出すことができるように、少し前に書いた最低限のバージョンです。これをさらに拡張して、適切な変換などを行うことができます。

//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でコンパイルしました。YMMV!

于 2013-02-18T20:49:12.737 に答える
3

Sage数学ツールを使用してみてください。Sage は Python を使用して、PARI を含むあらゆる種類の数学ライブラリを結合します。うまく統合されている数学ライブラリもあれば、ハック (ライブラリに文字列を渡してから文字列の結果を解析する) を使用するものもありますが、いずれの場合も他の誰かが統合作業を行っており、そのまま使用できます。

独自の Sage システムをセットアップするか、無料のアカウントを取得して、ワシントン大学のサーバーで Sage を試すことができます。

于 2013-02-18T21:59:57.363 に答える