Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 12 additions & 13 deletions src/sage/rings/cfinite_sequence.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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"""
Expand Down Expand Up @@ -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()

Expand All @@ -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)
Expand Down