Before proceeding, let me thank William for answering my original
question. In the case I was interested in, the number of return values
does not vary in any funny way, so I can use nvals to get what I want
back out.

But in the example of IsIsomorphic, there seems to be a problem. If I
start Magma and type

> E := EllipticCurve([2,1]);
> F := EllipticCurve([5,1]);
> bool, phi := IsIsomorphic(E,F);

then the identifier phi remains undefined! And in Sage, if I type

sage: E = magma.EllipticCurve([2,1]);
sage: F = magma.EllipticCurve([5,1])
sage: bool, phi = magma.IsIsomorphic(E, F, nvals=2)

this generates an error:

<type 'exceptions.RuntimeError'>: Error evaluation Magma code.
IN:_sage_[9], _sage_[10] := IsIsomorphic(_sage_[4],_sage_[8]);
OUT:
>> _sage_[9], _sage_[10] := IsIsomorphic(_sage_[4],_sage_[8]);
                    ^
Runtime error in :=: Illegal undefined assignment for LHS index
assignment

In a perfect world, the above would run and produce bool == False, phi
== None. Sigh.

Kiran

On Jan 16, 12:26 pm, Robert Bradshaw <[EMAIL PROTECTED]>
wrote:
> There is no way in python to detect how many arguments a function
> result will be assigned to, and I'm not a fan of magma's way of doing
> it. WIth variable length tuples one has to check the length of a
> tuple before unpacking it.
>
> There is a function E1.isomorphism_to(E2) that actually computes the
> isomorphism. I think is_isomorphism should just return True or False
> (is_* has that convention). Then one can do such things as
>
> if E.is_isomporhic(F):
>      ...
>
> Perhaps an optional argument "compute" which computes and then caches
> or returns the actual isomorphism.
>
> - Robert
>
> On Jan 16, 2008, at 6:03 AM, John Cremona wrote:
>
> > What a coincidence -- the patch I am working on *will* (have the
> > capability to) return both a boolean and an isomorphism for
> > is_isomorphic() on elliptic curves.  I was wondering how to do that
> > and assumed that it would be a tuple.  Rather than make the tuple's
> > length (1 or 2) depend on the input I would always return a tuple of
> > length 2 but the second item would be None iff the first has false.
> > Isn't that a reasonable way of doing it?
>
> > I don't like requiring the trapping of errors, though I realise that
> > it is very Pythonesque to do so.  But if we allow the input line
> > sage: phi = E1.isomorphism(E2)
>
> > then we *must* raise an error when the things are not isomorphic,
> > just as
> > sage: QQ(2).nth_root(2)
> > raises as ValueError (though sqrt(2) does not as it creates a
> > symbolic sqrt(2)).
>
> > This is going beyond the original thread, I know.
>
> > On 16/01/2008, David Kohel <[EMAIL PROTECTED]> wrote:
>
> >> There was a thread on multiple return values coming from Magma,
> >> since renamed to "Integer points on conics"
>
> >> William pointed out that one can access the multiple return values
> >> using nvals:
>
> >>  x = magma.XGCD(15, 10)
> >>  x,y,z = magma.XGCD(15, 10, nvals = 3)
>
> >> The first returns an integer, while the second returns a tuple.
>
> >> Q1: Is this an acceptable general construction for Python and/or
> >> SAGE,
> >> namely to return a different type depending on the values passed into
> >> it?  Is it acceptable when it is controlled by nvals in exactly this
> >> way?
>
> >> As William pointed out, very different algorithms can be called
> >> depending on the
> >> number of arguments requested in Magma.  The following is an example:
>
> >> sage: E = magma.EllipticCurve([1,3])
> >> sage: magma.IsIsomorphic(E,E)
> >> true
> >> sage: bool, phi = magma.IsIsomorphic(E,E,nvals=2)
> >> sage: phi
> >> Elliptic curve isomorphism from: Elliptic Curve defined by y^2 =
> >> x^3 +
> >> x + 3 over Rational Field to Elliptic Curve defined by y^2 = x^3 +
> >> x +
> >> 3 over Rational Field
> >> Taking (x : y : 1) to (x : y : 1)
>
> >> Currently in SAGE we have:
>
> >> sage: E = EllipticCurve([1,3])
> >> sage: E.is_isomorphic(E)
> >> True
>
> >> Q2: Would the following be acceptable way of implementing equivalent
> >> functionality in SAGE?:
>
> >> sage: bool, phi = E.is_isomorphic(E, nvals=2)
>
> >> Note that often (in many concexts) it more expensive to return an
> >> isomorphism, but only slightly more so compared with recomputing the
> >> isomorphism test.  If the answer to my question is "no, it not
> >> acceptable SAGE/Python syntax", then how should we implement this
> >> functionality?  One possibility is:
>
> >> sage: phi = E1.isomorphism(E2)
>
> >> and to trap an error if is_isomorphic returns false.  Is this a
> >> better?
>
> > --
> > John Cremona
--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-devel@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/sage-devel
URLs: http://sage.scipy.org/sage/ and http://modular.math.washington.edu/sage/
-~----------~----~----~----~------~----~------~--~---

Reply via email to