Dear all,

The implementation of QQ[] using FLINT is making lots of progress and
it seems as if everything should be *much* faster than it is now.

At the moment, I've got two questions.  First one is about the design
of the gcd method, and possibly affects other rings too.  The second
method is pretty implementation specific; I'd be grateful if someone
with a good knowledge of FLINT and GMP could please have a look at it,
because otherwise it might lead to some difficult bugs later.

1.

Given rational polynomials a and b, what should gcd(a,b) return?  The
problem arises since the gcd is only defined up to rational units.  I
think the two sound options are either the monic normalisation, or a
primitive integer polynomial with positive leading coefficient.

Personally, I would be in favour of the second choice, because in the
new implementation using FLINT, the polynomial is represented as an
integer polynomial with a positive integer denominator coprime to the
content of the numerator.  If in a higher level block of code calls
are made to gcd on a frequent basis, this would be faster than if gcd
always had to return the monic version.

Here are two other examples from SAGE (ignoring the case gcd(0,0) ==
0):

  - Integers:  Positive values.
  - Rationals:  1.
  - Integer polynomials:  Polynomial with positive leading
coefficient.
  - Polynomials over Z/nZ via FLINT:  Not quite sure, except that gcd
(a,0) == a and gcd(0,b) == b.  By the way, working in (Z/27Z)[t], gcd
(3*t+2, (3*t+2)*(t^3 + t - 1)) returns 1, which looks like a bug.  In
any case, enforcing gcd(a,0) == a leads to an inconsistent
normalisation, so it might also be a good idea to think about what gcd
should return working in (Z/nZ)[t].

I'd appreciate your input on how to normalise the gcd output.

2.

One of the input methods for rational polynomials needs to take a SAGE
Rational.  In particular, it needs to initialise an integer of type
fmpz_t and set it to the value of an integer of type mpz_t.  The
following block of code illustrates the problem (although it doesn't
exactly like this appear in my code):

    # Assume that x a rational is of type mpq_t, properly initialised
to some value.
    # Want to set den to the denominator of x.
    cdef fmpz_t den
    cdef unsigned long limbs
    limbs = mpz_size(mpq_denref(x))  # TODO:  Check that fmpz and mpz
limbs are compatible!
    den = fmpz_init(limbs)
    mpz_to_fmpz(den, mpq_denref(x))

I am afraid that this way, the call "fmpz_init(limbs)" might not
allocate enough room for the value I want to store.  I have worked
with GMP (using C code) before, but this is the first time that I am
working with FLINT and hence fmpz_t's.  Can someone please confirm
that the above code does the right thing, or let me know how to do
this?

Many thanks!

Sebastian
--~--~---------~--~----~------------~-------~--~----~
To post to this group, send an email to sage-devel@googlegroups.com
To unsubscribe from this group, send an email to 
sage-devel-unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---

Reply via email to