From 8e6b1bdf250ffbdc0b3d6f92a71d8cac08bed5ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Thu, 1 Aug 2024 10:18:07 +0200 Subject: [PATCH] get rid of sage_eval in cfinite_sequence --- src/sage/rings/cfinite_sequence.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/sage/rings/cfinite_sequence.py b/src/sage/rings/cfinite_sequence.py index f34f4514186..e1f66b62e62 100644 --- a/src/sage/rings/cfinite_sequence.py +++ b/src/sage/rings/cfinite_sequence.py @@ -90,6 +90,7 @@ from numbers import Integral from sage.categories.rings import Rings +from sage.libs.pari import pari from sage.misc.inherit_comparison import InheritComparisonClasscallMetaclass from sage.rings.integer_ring import ZZ from sage.rings.rational_field import QQ @@ -102,11 +103,6 @@ from sage.structure.parent import Parent from sage.structure.unique_representation import UniqueRepresentation -from sage.interfaces.gp import Gp -from sage.misc.sage_eval import sage_eval - -_gp = None - def CFiniteSequences(base_ring, names=None, category=None): r""" @@ -1215,6 +1211,13 @@ def guess(self, sequence, algorithm='sage'): C-finite sequence, generated by -1/2/(x - 1/2) sage: r[0:5] [1, 2, 4, 8, 16] + + Using pari:: + + sage: r = C.guess([1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28], algorithm='pari'); r + C-finite sequence, generated by (-x - 1)/(x^3 + x^2 - 1) + sage: r[0:5] + [1, 1, 1, 2, 2] """ S = self.polynomial_ring() @@ -1232,22 +1235,18 @@ def guess(self, sequence, algorithm='sage'): return CFiniteSequence(numerator / denominator) if algorithm == 'pari': - global _gp if len(sequence) < 6: raise ValueError('sequence too short for guessing') - if _gp is None: - _gp = Gp() - _gp("ggf(v)=local(l,m,p,q,B);l=length(v);B=floor(l/2);\ + pari("ggf(v)=local(l,m,p,q,B);l=length(v);B=l\\2;\ if(B<3,return(0));m=matrix(B,B,x,y,v[x-y+B+1]);\ q=qflll(m,4)[1];if(length(q)==0,return(0));\ p=sum(k=1,B,x^(k-1)*q[k,1]);\ q=Pol(Pol(vector(l,n,v[l-n+1]))*p+O(x^(B+1)));\ if(polcoeff(p,0)<0,q=-q;p=-p);q=q/p;p=Ser(q+O(x^(l+1)));\ for(m=1,l,if(polcoeff(p,m-1)!=v[m],return(0)));q") - _gp.set('gf', sequence) - _gp("gf=ggf(gf)") - num = S(sage_eval(_gp.eval("Vec(numerator(gf))"))[::-1]) - den = S(sage_eval(_gp.eval("Vec(denominator(gf))"))[::-1]) + pari_guess = pari("ggf")(sequence) + num = S(pari_guess.numerator().Vec().sage()[::-1]) + den = S(pari_guess.denominator().Vec().sage()[::-1]) if num == 0: return 0 return CFiniteSequence(num / den)