私が定義したさまざまなs の関数を計算するためだけに、Python からPARI/GPを呼び出したいと思います。残念ながら、pari-pythonをインストールすることができないので、Python 経由でコマンド ラインを使用して呼び出すだけでよいと考えました。ただし、マニュアル ページを参照しても、PARI/GP を非対話モードで実行する方法がわかりません。これを達成する方法はありますか?nextprime(n)
n
os.system
3 に答える
-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!
Sage数学ツールを使用してみてください。Sage は Python を使用して、PARI を含むあらゆる種類の数学ライブラリを結合します。うまく統合されている数学ライブラリもあれば、ハック (ライブラリに文字列を渡してから文字列の結果を解析する) を使用するものもありますが、いずれの場合も他の誰かが統合作業を行っており、そのまま使用できます。
独自の Sage システムをセットアップするか、無料のアカウントを取得して、ワシントン大学のサーバーで Sage を試すことができます。