diff --git a/src/sage/rings/cfinite_sequence.py b/src/sage/rings/cfinite_sequence.py index 6b04e1ee66f..4166083de4a 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""" @@ -1204,6 +1200,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() @@ -1221,22 +1224,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)