On Sun, Jul 27, 2014 at 12:52 PM, John Cremona <[email protected]> wrote:
> Minor remark:  if you have defined x to be a polynomial ring generator
> then Sage will happily form rational functions without you having to
> define new rings:
>
> sage: R.<x> = GF(3)[]
> sage: R
> Univariate Polynomial Ring in x over Finite Field of size 3
> sage: f = x+1/x
> sage: f.parent()
> Fraction Field of Univariate Polynomial Ring in x over Finite Field of size 3

Or, as David Kohel used to always remind me, making "/" something that
always constructs something in the fraction field was a good design
decision in Magma, which he made sure I maintained in Sage.

>>> R<x> := PolynomialRing(GF(3));
>>> Parent(1/x);
Univariate rational function field over GF(3) Variables: x
>>> Parent(2/1);
Rational Field




>
> On 27 July 2014 20:26, Simon King <[email protected]> wrote:
>> Hi Kevin,
>>
>> On 2014-07-27, Kevin Buzzard <[email protected]> wrote:
>>> [I've just build a degree 6 poly. Now let's build a degree 12 one]
>>>
>>> sage: h=expand((g.subs(x+2/x))*x^6)
>>
>> Let's work without the x^6 factor:
>>
>>   sage: g
>>   x^6 + 2*x^3 + x + 1
>>   sage: g.subs(x+2/x).expand()
>>   2/x + 1/x^3 + 1/x^6
>>
>> No idea what is going wrong here. Let's try different ways to
>> substitute:
>>
>>   sage: g(x=x+2/x).expand()
>>   2/x + 1/x^3 + 1/x^6
>>
>> Same problem. Whithout expanding, it seems to be fine:
>>
>>   sage: g.subs(x+2/x)
>>   (((x + 2/x)^3 + 2)*(x + 2/x)^2 + 1)*(x + 2/x) + 1
>>
>> I guess the above form comes from Horner's scheme.
>>
>> Now, really strange: If one copy-and-pastes the above expression and
>> expands it, then all is fine!
>>
>>   sage: ((((x + 2/x)^3 + 2)*(x + 2/x)^2 + 1)*(x + 2/x) + 1).expand()
>>   x^6 + 12*x^4 + 2*x^3 + 60*x^2 + 13*x + 26/x + 240/x^2 + 16/x^3 + 192/x^4 + 
>> 64/x^6 + 161
>>
>> That is all very puzzling to me---and is yet another reason for my creed
>> that one should use *proper* polynomials and not symbolic expressions
>> (see below for the underlying types).
>>
>>> Am I some sort of a victim of some secret property of the letter 'x'?
>>
>> Not of the letter 'x', but of the fact that the variable x is
>> pre-defined in Sage as a symbolic expression, which often enough causes
>> trouble to those who expect to work with polynomials. Note that x is *not*
>> the generator of a polynomial ring:
>>
>>   sage: type(x)
>>   <type 'sage.symbolic.expression.Expression'>
>>
>> whereas your polynomial g is a proper polynomial (there are various 
>> underlying
>> implementations of polynomials in Sage, for different purposes, and this
>> one relies on FLINT):
>>
>>   sage: type(g)
>>   <type 'sage.rings.polynomial.polynomial_zmod_flint.Polynomial_zmod_flint'>
>>
>>> I
>>> wanted to use x rather than another letter because that would save me from
>>> having to define the ring GF(3)[x,1/x] which would have involved some
>>> thinking on my part ;-)
>>
>> Well, the polynomial ring already is there:
>>
>>   sage: g.parent()
>>   Univariate Polynomial Ring in x over Finite Field of size 3
>>
>> and the fraction field will automatically be created when needed. So,
>> you could do:
>>
>>   sage: g.parent().inject_variables()
>>   Defining x
>>
>> The preceding line works if you are in an interactive session.
>> Alternatively (or if you write a program), you could explicitly define
>> it:
>>
>>   sage: x = g.parent().gen()
>>   sage: type(x)
>>   <type 'sage.rings.polynomial.polynomial_zmod_flint.Polynomial_zmod_flint'>
>>
>> Now, the substitution works out of the box, and "expansion" of symbolic
>> expressions is not needed, since we work with proper polynomials and
>> their quotients.
>>
>>   sage: g.subs(x+2/x)
>>   (x^12 + 2*x^9 + x^7 + 2*x^6 + 2*x^5 + x^3 + 1)/x^6
>>
>> My general recommendation is: Unless you want to do calculus, get used
>> to define x as the generator of an appropriate polynomial ring, taking
>> care of the underlying range of coefficients. This is totally easy in an
>> interactive session:
>>
>>   sage: P.<x> = QQ[]  # or GF(3)['x'] in your case
>>
>> The above line both defines P and x, as polynomial ring over the
>> rationals, and its generator. In a program, you should write
>>
>>   P = QQ['x']   # or GF(3)['x'] in your case
>>   x = P.gen()
>>
>> instead.
>>
>> Best regards,
>> Simon
>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups 
>> "sage-support" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/sage-support.
>> For more options, visit https://groups.google.com/d/optout.
>
> --
> You received this message because you are subscribed to the Google Groups 
> "sage-support" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sage-support.
> For more options, visit https://groups.google.com/d/optout.



-- 
William Stein
Professor of Mathematics
University of Washington
http://wstein.org

-- 
You received this message because you are subscribed to the Google Groups 
"sage-support" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sage-support.
For more options, visit https://groups.google.com/d/optout.

Reply via email to