thanks for the honor - or not: I am not the author of this domain.

It is a "mutable domain" 

)bo PUSH('ModMonic, $mutableDomains)

 I used that,  when we extended  finite fields, along the lines of the existing 
standard implemention at that time.



Am 24.10.2011 um 14:54 schrieb Gabriel Dos Reis:

> 
> Consider the definition of ModMonoid:
> --------------8<---------------8<----------------8<--------------
>     )abbrev domain MODMON ModMonic
>     ++ Description:
>     ++ This package \undocumented
> 
>     ModMonic(R,Rep): C == T
>      where
>       R: Ring
>       Rep: UnivariatePolynomialCategory(R)
>       C == Join(UnivariatePolynomialCategory(R),CoercibleFrom Rep) with
>       --operations
>         setPoly : Rep -> Rep
>             ++ setPoly(x) \undocumented
>         modulus : -> Rep
>             ++ modulus() \undocumented
>         reduce: Rep -> %
>             ++ reduce(x) \undocumented
>         lift: % -> Rep --reduce lift = identity
>             ++ lift(x) \undocumented
>         Vectorise: % -> Vector(R)
>             ++ Vectorise(x) \undocumented
>         UnVectorise: Vector(R) -> %
>             ++ UnVectorise(v) \undocumented
>         An: % -> Vector(R)
>             ++ An(x) \undocumented
>         pow : -> PrimitiveArray(%)
>             ++ pow() \undocumented
>         computePowers : -> PrimitiveArray(%)
>             ++ computePowers() \undocumented
>         if R has FiniteFieldCategory then
>            frobenius: % -> %
>             ++ frobenius(x) \undocumented
>         --LinearTransf: (%,Vector(R)) -> SquareMatrix<deg> R
>       --assertions
>         if R has Finite then Finite
>       T == add
>         --constants
>           m:Rep := monomial(1,1)$Rep --| degree(m) > 0 and LeadingCoef(m) = 
> R$1
>           d := degree(m)$Rep
>           d1 := (d-1):NonNegativeInteger
>           twod := 2*d1+1
>           frobenius?:Boolean := R has FiniteFieldCategory
>           --VectorRep:= DirectProduct(d:NonNegativeInteger,R)
>         --declarations
>           x,y: %
>           p: Rep
>           d,n: Integer
>           e,k1,k2: NonNegativeInteger
>           c: R
>           --vect: Vector(R)
>           power:PrimitiveArray(%)
>           frobeniusPower:PrimitiveArray(%)
>           computeFrobeniusPowers : () -> PrimitiveArray(%)
>         --representations
>         --mutable m    --take this out??
>         --define
>           power := new(0,0)
>           frobeniusPower := new(0,0)
>           setPoly (mon : Rep) ==
>             mon =$Rep m => mon
>             oldm := m
>             not one? leadingCoefficient mon => error "polynomial must be 
> monic"
>             -- following copy code needed since FFPOLY can modify mon
>             copymon:Rep:= 0
>             while not zero? mon repeat
>                copymon := monomial(leadingCoefficient mon, degree mon)$Rep + 
> copymon
>                mon := reductum mon
>             m := copymon
>             d := degree(m)$Rep
>             d1 := (d-1)::NonNegativeInteger
>             twod := 2*d1+1
>             power := computePowers()
>             if frobenius? then
>               degree(oldm)>1 and not((oldm exquo$Rep m) case "failed") =>
>                   for i in 1..d1 repeat
>                     frobeniusPower(i) := reduce lift frobeniusPower(i)
>               frobeniusPower := computeFrobeniusPowers()
>             m
>           modulus == m
>           if R has Finite then
>              size == d * size()$R
>              random == UnVectorise([random()$R for i in 0..d1])
>           0 == 0$Rep
>           1 == 1$Rep
>           c * x == c *$Rep x
>           n * x == (n::R) *$Rep x
>           coerce(c:R):% == monomial(c,0)$Rep
>           coerce(x:%):OutputForm == coerce(x)$Rep
>           coefficient(x,e):R == coefficient(x,e)$Rep
>           reductum(x) == reductum(x)$Rep
>           leadingCoefficient x == (leadingCoefficient x)$Rep
>           degree x == (degree x)$Rep
>           lift(x) == x pretend Rep
>           reduce(p) == (monicDivide(p,m)$Rep).remainder
>           coerce(p) == reduce(p)
>           x = y == x =$Rep y
>           x + y == x +$Rep y
>           - x == -$Rep x
>           x * y ==
>             p := x *$Rep y
>             ans:=0$Rep
>             while (n:=degree p)>d1 repeat
>                ans:=ans + leadingCoefficient(p)*power.(n-d)
>                p := reductum p
>             ans+p
>           Vectorise(x) == [coefficient(lift(x),i) for i in 0..d1]
>           UnVectorise(vect) ==
>             reduce(+/[monomial(vect.(i+1),i) for i in 0..d1])
>           computePowers ==
>                mat : PrimitiveArray(%):= new(d,0)
>                mat.0:= reductum(-m)$Rep
>                w: % := monomial$Rep (1,1)
>                for i in 1..d1 repeat
>                   mat.i := w *$Rep mat.(i-1)
>                   if degree mat.i=d then
>                     mat.i:= reductum mat.i + leadingCoefficient mat.i * mat.0
>                mat
>           if frobenius? then
>               computeFrobeniusPowers() ==
>                 mat : PrimitiveArray(%):= new(d,1)
>                 mat.1:= mult := monomial(1, size()$R)$%
>                 for i in 2..d1 repeat
>                    mat.i := mult * mat.(i-1)
>                 mat
> 
>               frobenius(a:%):% ==
>                 aq:% := 0
>                 while not zero? a repeat
>                   aq:= aq + leadingCoefficient(a)*frobeniusPower(degree a)
>                   a := reductum a
>                 aq
> 
>           pow == power
>           monomial(c,e)==
>              if e<d then monomial(c,e)$Rep
>              else
>                 if e<=twod then
>                    c * power.(e-d)
>                 else
>                    k1:=e quo twod
>                    k2 := (e-k1*twod)::NonNegativeInteger
>                    reduce((power.d1 **k1)*monomial(c,k2))
>           if R has Field then
> 
>              (x:% exquo y:%):Union(%, "failed") ==
>                 uv := extendedEuclidean(y, modulus(), x)$Rep
>                 uv case "failed" => "failed"
>                 return reduce(uv.coef1)
> 
>              recip(y:%):Union(%, "failed") ==  1 exquo y
>              divide(x:%, y:%) ==
>                 (q := (x exquo y)) case "failed" => error "not divisible"
>                 [q, 0]
> 
>     --     An(MM) == Vectorise(-(reduce(reductum(m))::MM))
>     --     LinearTransf(vect,MM) ==
>     --       ans:= 0::SquareMatrix<d>(R)
>     --       for i in 1..d do setelt(ans,i,1,vect.i)
>     --       for j in 2..d do
>     --          setelt(ans,1,j, elt(ans,d,j-1) * An(MM).1)
>     --          for i in 2..d do
>     --            setelt(ans,i,j, elt(ans,i-1,j-1) + elt(ans,d,j-1) * 
> An(MM).i)
>     --       ans
> 
> --------------8<---------------8<----------------8<--------------
> 
> Its description does not have a claim for "author", but the intersection
> of authors of domains using this domain leaves me with Johannes Grabmeier :-)
> 
> 
> ModMonic is not a builtin domain, therefore one needs a definition of its
> representation, i.e. a definition for "Rep", is needed.  Yet, none is
> provided.  Rather, "Rep" here is specified as a parameter to the functor.
> (That is not the same as defining it locally to some value)
> 
> Now, consider the capsule-level variable "power".  It is declared as
> 
>           power:PrimitiveArray(%)
> 
> then later assigned to as
> 
>           power := new(0,0)
> 
> There are two lexical occurences of the literal '0' in there.  Can you
> guess, which one is which?  There are at least five interpretations for
> each constant:
> 
>      0: R   -- the parameter R satisfies Ring
>      0: Rep -- the parameter Rep satisfies UnivariatePolynomialCategory(R)
>      0: %   -- the current domains satisfies same
>      0: NonNegativeInteger
>      0: Integer
> 
> 
> That this domain compiles at all is mysterious; it happens to depend on
> a very obscure implementation detail of AXIOM compilers, one that is not
> advertised at all -- and I don't think it should.  
> It is voodoo.  So, I am calling it Johannes's Rep voodoo :-).
> 
> Brownie point to anyone who untangles it not to use the voodoo.
> 
> NB: I ran into this domain while working on a completely different
> issue, one that related to fixing several shortcomings in the way
> constants are processed in many AXIOM systems.
> 
> -- Gaby
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "FriCAS - computer algebra system" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/fricas-devel?hl=en.
> 

Mit freundlichen Grüßen

Johannes Grabmeier

Prof. Dr. Johannes Grabmeier
Köckstraße 1, D-94469 Deggendorf
Tel. +49-(0)-991-2979584, Tel. +49-(0)-171-5503789
Tel. +49-(0)-991-3615-100 (d),  Fax: +49-(0)-1803-5518-17745

-- 
You received this message because you are subscribed to the Google Groups 
"FriCAS - computer algebra system" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/fricas-devel?hl=en.

Reply via email to