On Wed, Sep 18, 2013 at 3:46 PM, Peter Bruin <[email protected]> wrote:
>> Here's a concrete example: where should the generic implementation for
>> Euclid's operation live for computing e.[x]gcd(e)? It seems that it
>> makes the most sense to place this in the category rather than the
>> (many) element implementations (unless, of course, there are
>> compelling performance reasons).
>
>
> I would suggest that [x]gcd should be a method of the EuclideanDomainElement
> class (as it currently is).

Would any (non-dynamic) element class inherit from this?

> In the modified framework that I am thinking
> of, suppose the user constructs an instance R of the class Ring (or a
> subclass) that is a priori not Euclidean.  Suppose also that R is detected
> to be Euclidean during construction (e.g. because R = PolynomialRing(A) and
> A happens to be a field) and placed in EuclideanDomains.  Then, instead of
> making EuclideanDomains add its ElementMethods to R.element_class, I propose
> that the following should happen:
>
> R will be made an object in the category EuclideanDomains;
> EuclideanDomains has an attribute Object, which equals the class
> EuclideanDomain;
> therefore, EuclideanDomains has a dynamically generated object_class
> inheriting from EuclideanDomain;
> R will dynamically be made an instance of EuclideanDomains.object_class (by
> using EuclideanDomain as a base class or via some __getattr__());
> hence R will dynamically inherit from EuclideanDomain;
> furthermore, EuclideanDomain (being a subclass of Parent) has an attribute
> Element, which equals the class EuclideanDomainElement;
> therefore, R has a dynamically generated element_class inheriting from
> EuclideanDomainElement;
> R.element_class will dynamically be made to inherit from
> EuclideanDomain.element_class;
> hence R.element_class will dynamically inherit from EuclideanDomainElement,
> and have the correct gcd method.
>
> As you see, I am absolutely not trying to avoid the category framework; I
> think this approach uses it just as much as the existing one.  The
> difference is that the category of Euclidean domains no longer directly
> specifies element behaviour, but does it via its object class, which I would
> find much more satisfactory.  Assuming that something like the above would
> work, of course!

Basically, you want

    class IntegralDomainElement(Element):
        ...

    class IntegralDomain(Parent):
        ...

    class EuclideanDomainElement(IntegralDomainElement):
        def xgcd(self, other):
            ...

    class EuclideanDomain(IntegralDomain):
       Element = EuclideanDomainElement

    class EuclideanDomains(IntegralDomains):
        ParentMethods = EuclideanDomain

instead of

    class EuclideanDomainElement:
        def xgcd(self, other):
            ...

    class EuclideanDomain:
        ...

    class EuclideanDomains(IntegralDomains):
        ElementMethods = EuclideanDomainElement
        ParentMethods = EuclideanDomain

Is that a fair summary? One downside I see in this is redundancy (this
is a simple case, but if I want to insert PrincipalIdealDomains
between IntegralDomains and EuclideanDomains I have to hunt down
multiple places.) What's the value in letting EuclideanDomainElement
inherit from Element or IntegralDomainElement? I also see possible
issues here with multiple inheritance (e.g. the C struct
incompatibilities between RingElement and MatrixIntegerDense).

- Robert

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" 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-devel.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to