私は Sage (スクリプトで通常の Python 構文を使用できる Python で書かれたコンピュータ代数システム) で非常に単純な試行錯誤のコードをいくつか書きました。この小さなコード スニペットは、多項式を作成し、係数を使用していくつかの計算を行います。特に、係数の 3 つの式によって生成される理想の Groebner 基底を決定します。
問題は次のとおりです。このプログラムは、カーネルによって強制終了されるまで実行され、すべてのメモリを使い果たします。反復ごとに 200kB 程度しか消費しませんが、このメモリが再び解放されることはありません。
これがコードです。詳細はそれほど重要ではなく、非常にかさばるので、省略します。
R = PolynomialRing(QQ, 2, 'bc', order='lex')
expr1, expr2, expr3 = ...
for i in range (0,50):
for j in range(i+1,50):
for k in range(j+1,50):
for l in range(k+1,50):
for m in range(l+1,50):
for n in range(m+1,50):
poly = (x-i)*(x-j)*(x-k)*(x-l)*(x-m)*(x-n)
r = poly.coeffs()
p1 = expr1.substitute(r...)
p2 = expr2.substitute(r...)
p3 = expr3.substitute(r...)
I = (p1, p2, p3)*R
B = I.groebner_basis()
Pythonのメモリ管理を理解している限り、ループ本体の変数は頻繁に解放されます。現在、それはプログラミングの問題、内部の python の問題、または Sage ルーチンの問題である可能性があります。知らない。私のコードの問題を見つけることができますか、それとも別の問題ですか?