#9935: Make a symbolic mod function
-----------------------------+------------------------
       Reporter:  jason      |        Owner:  burcin
           Type:  defect     |       Status:  new
       Priority:  major      |    Milestone:  sage-6.4
      Component:  symbolics  |   Resolution:
       Keywords:             |    Merged in:
        Authors:             |    Reviewers:
Report Upstream:  N/A        |  Work issues:
         Branch:             |       Commit:
   Dependencies:             |     Stopgaps:
-----------------------------+------------------------
Description changed by jdemeyer:

Old description:

> A participant in the PREP program noticed that mod is not a symbolic
> function:
>
> {{{
> sage: mod(x,4)
> ERROR: An unexpected error occurred while tokenizing input
> The following traceback may be corrupted or invalid
> The error message is: ('EOF in multi-line statement', (4562, 0))
>
> ERROR: An unexpected error occurred while tokenizing input
> The following traceback may be corrupted or invalid
> The error message is: ('EOF in multi-line statement', (4530, 0))
>
> ERROR: An unexpected error occurred while tokenizing input
> The following traceback may be corrupted or invalid
> The error message is: ('EOF in multi-line statement', (842, 0))
>
> ---------------------------------------------------------------------------
> TypeError                                 Traceback (most recent call
> last)
>
> /home/grout/sage-4.5.2/devel/sage-main/sage/functions/<ipython console>
> in <module>()
>
> /home/grout/sage/local/lib/python2.6/site-
> packages/sage/rings/finite_rings/integer_mod.so in
> sage.rings.finite_rings.integer_mod.Mod
> (sage/rings/finite_rings/integer_mod.c:2633)()
>
> /home/grout/sage/local/lib/python2.6/site-
> packages/sage/rings/finite_rings/integer_mod.so in
> sage.rings.finite_rings.integer_mod.IntegerMod
> (sage/rings/finite_rings/integer_mod.c:2952)()
>
> /home/grout/sage/local/lib/python2.6/site-
> packages/sage/rings/finite_rings/integer_mod.so in
> sage.rings.finite_rings.integer_mod.IntegerMod_int.__init__
> (sage/rings/finite_rings/integer_mod.c:14249)()
>
> /home/grout/sage/local/lib/python2.6/site-
> packages/sage/structure/parent.so in
> sage.structure.parent.Parent.__call__ (sage/structure/parent.c:6407)()
>
> /home/grout/sage/local/lib/python2.6/site-
> packages/sage/structure/coerce_maps.so in
> sage.structure.coerce_maps.NamedConvertMap._call_
> (sage/structure/coerce_maps.c:4053)()
>
> /home/grout/sage/local/lib/python2.6/site-
> packages/sage/symbolic/expression.so in
> sage.symbolic.expression.Expression._integer_
> (sage/symbolic/expression.cpp:4026)()
>
> TypeError: unable to convert x (=x) to an integer
> }}}
>
> Hopefully it should be easy to wrap mod in a symbolic function, something
> like:
>
> {{{
> sage: def eval_mod(self, x):
> ....:     if isinstance(x, (int, Integer)):
> ....:         return mod(x,5)
> ....:     return None
> ....:
> sage: f=function('f', eval_func=eval_mod)
> sage: f(x)
> f(x)
> sage: f(13)
> 3
> sage: f(x^2+x+1)
> f(x^2 + x + 1)
> sage: f(x^2+x+1).subs(x=2)
> 2
> sage: f(x^2+x+1).subs(x=3)
> 3
> sage: f(x^2+x^3).subs(x=1)
> 2
> sage: f(x^2+x^3).subs(x=2)
> 2
> sage: f(x^2+x^3).subs(x=3)
> 1
> }}}

New description:

 A participant in the PREP program noticed that mod is not a symbolic
 function:

 {{{
 sage: mod(x,4)
 ERROR: An unexpected error occurred while tokenizing input
 The following traceback may be corrupted or invalid
 The error message is: ('EOF in multi-line statement', (4562, 0))

 ERROR: An unexpected error occurred while tokenizing input
 The following traceback may be corrupted or invalid
 The error message is: ('EOF in multi-line statement', (4530, 0))

 ERROR: An unexpected error occurred while tokenizing input
 The following traceback may be corrupted or invalid
 The error message is: ('EOF in multi-line statement', (842, 0))

 ---------------------------------------------------------------------------
 TypeError                                 Traceback (most recent call
 last)

 /home/grout/sage-4.5.2/devel/sage-main/sage/functions/<ipython console> in
 <module>()

 /home/grout/sage/local/lib/python2.6/site-
 packages/sage/rings/finite_rings/integer_mod.so in
 sage.rings.finite_rings.integer_mod.Mod
 (sage/rings/finite_rings/integer_mod.c:2633)()

 /home/grout/sage/local/lib/python2.6/site-
 packages/sage/rings/finite_rings/integer_mod.so in
 sage.rings.finite_rings.integer_mod.IntegerMod
 (sage/rings/finite_rings/integer_mod.c:2952)()

 /home/grout/sage/local/lib/python2.6/site-
 packages/sage/rings/finite_rings/integer_mod.so in
 sage.rings.finite_rings.integer_mod.IntegerMod_int.__init__
 (sage/rings/finite_rings/integer_mod.c:14249)()

 /home/grout/sage/local/lib/python2.6/site-
 packages/sage/structure/parent.so in sage.structure.parent.Parent.__call__
 (sage/structure/parent.c:6407)()

 /home/grout/sage/local/lib/python2.6/site-
 packages/sage/structure/coerce_maps.so in
 sage.structure.coerce_maps.NamedConvertMap._call_
 (sage/structure/coerce_maps.c:4053)()

 /home/grout/sage/local/lib/python2.6/site-
 packages/sage/symbolic/expression.so in
 sage.symbolic.expression.Expression._integer_
 (sage/symbolic/expression.cpp:4026)()

 TypeError: unable to convert x (=x) to an integer
 }}}

 Hopefully it should be easy to wrap mod in a symbolic function, something
 like:

 {{{
 sage: def eval_mod(self, x):
 ....:     if isinstance(x, (int, Integer)):
 ....:         return mod(x,5)
 ....:     return None
 ....:
 sage: f=function('f', eval_func=eval_mod)
 sage: f(x)
 f(x)
 sage: f(13)
 3
 sage: f(x^2+x+1)
 f(x^2 + x + 1)
 sage: f(x^2+x+1).subs(x=2)
 2
 sage: f(x^2+x+1).subs(x=3)
 3
 sage: f(x^2+x^3).subs(x=1)
 2
 sage: f(x^2+x^3).subs(x=2)
 2
 sage: f(x^2+x^3).subs(x=3)
 1
 }}}

 See also [​http://ask.sagemath.org/question/25037/declaring-variable-to-
 be-in-a-particular-fieldringgroup/]

--

--
Ticket URL: <http://trac.sagemath.org/ticket/9935#comment:7>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica, 
and MATLAB

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

Reply via email to