# valuation() error

12 views

### enthor

Jun 19, 2021, 9:18:50 PMJun 19
to sage-support
My objective is to concisely define an expression with variables,
assign values to the variables, and then compute the answer.

Here is what I did today:

┌────────────────────────────────────────────────────────────────────┐
│ SageMath version 9.3.rc4, Release Date: 2021-04-18                 │
│ Using Python 3.9.2. Type "help()" for help.                        │
└────────────────────────────────────────────────────────────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Warning: this is a prerelease version, and it may be unstable.     ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
sage: z = SR.var('z')
sage: i = 2 * z
sage: i
2*z
sage: z
z
sage: type(i)
<class 'sage.symbolic.expression.Expression'>
sage: type(z)
<class 'sage.symbolic.expression.Expression'>
sage: z = random_prime(100)
sage: z
79
sage: type(z)
<class 'sage.rings.integer.Integer'>
sage: i
2*z
sage: valuation(i)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/var/tmp/sage-9.3.rc4-current/local/lib/python3.9/site-packages/sage/arith/misc.py in valuation(m, *args, **kwds)
743     try:
--> 744         return m.valuation(*args, **kwds)
745     except AttributeError:

/var/tmp/sage-9.3.rc4-current/local/lib/python3.9/site-packages/sage/structure/element.pyx in sage.structure.element.Element.__getattr__ (build/cythonized/sage/structure/element.c:4709)()
492         """
--> 493         return self.getattr_from_category(name)
494

/var/tmp/sage-9.3.rc4-current/local/lib/python3.9/site-packages/sage/structure/element.pyx in sage.structure.element.Element.getattr_from_category (build/cythonized/sage/structure/element.c:4821)()
505             cls = P._abstract_element_class
--> 506         return getattr_from_other_class(self, cls, name)
507

/var/tmp/sage-9.3.rc4-current/local/lib/python3.9/site-packages/sage/cpython/getattr.pyx in sage.cpython.getattr.getattr_from_other_class (build/cythonized/sage/cpython/getattr.c:2619)()
371         dummy_error_message.name = name
--> 372         raise AttributeError(dummy_error_message)
373     attribute = <object>attr

AttributeError: 'sage.symbolic.expression.Expression' object has no attribute '__custom_name'

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
/var/tmp/sage-9.3.rc4-current/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression._integer_ (build/cythonized/sage/symbolic/expression.cpp:8808)()
1298         try:
-> 1299             n = self.pyobject()
1300         except TypeError:

/var/tmp/sage-9.3.rc4-current/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression.pyobject (build/cythonized/sage/symbolic/expression.cpp:6143)()
586         if not is_a_numeric(self._gobj):
--> 587             raise TypeError("self must be a numeric expression")
588         return py_object_from_numeric(self._gobj)

TypeError: self must be a numeric expression

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-11-227398a9d1bf> in <module>
----> 1 valuation(i)

/var/tmp/sage-9.3.rc4-current/local/lib/python3.9/site-packages/sage/arith/misc.py in valuation(m, *args, **kwds)
744         return m.valuation(*args, **kwds)
745     except AttributeError:
--> 746         return ZZ(m).valuation(*args, **kwds)
747
748

/var/tmp/sage-9.3.rc4-current/local/lib/python3.9/site-packages/sage/structure/parent.pyx in sage.structure.parent.Parent.__call__ (build/cythonized/sage/structure/parent.c:9335)()
896         if mor is not None:
897             if no_extra_args:
--> 898                 return mor._call_(x)
899             else:
900                 return mor._call_with_args(x, args, kwds)

/var/tmp/sage-9.3.rc4-current/local/lib/python3.9/site-packages/sage/structure/coerce_maps.pyx in sage.structure.coerce_maps.NamedConvertMap._call_ (build/cythonized/sage/structure/coerce_maps.c:6042)()
285             raise TypeError("Cannot coerce {} to {}".format(x, C))
286         cdef Map m
--> 287         cdef Element e = method(C)
288         if e is None:
289             raise RuntimeError("BUG in coercion model: {} method of {} returned None".format(self.method_name, type(x)))

/var/tmp/sage-9.3.rc4-current/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression._integer_ (build/cythonized/sage/symbolic/expression.cpp:8857)()
1299             n = self.pyobject()
1300         except TypeError:
-> 1301             raise TypeError("unable to convert %r to an integer" % self)
1302         if isinstance(n, sage.rings.integer.Integer):
1303             return n

TypeError: unable to convert 2*z to an integer
sage:

### enthor

Jun 20, 2021, 1:41:15 AMJun 20
to sage-support
Well...I think I have resolved that problem. I am still not totally clear
on when Sage references Sage variables vs. Python variables.
Nevertheless...heh...I'm sure I will find out.

But, I would like to restate what I was trying to achieve.

Let's say I have a need to display a Question and an Answer.

The source for the Question and Answer  comes from a single string.

And suppose  the string has 0 -> n sub-strings that are to be replaced with
random strings. The substituted Question string is to be
displayed, and then evaluated to derive an Answer string.

Here is my working example (after 10 attempts) to create the Question= "2*random"

exec(compile("r=random_prime(100);Q='2*'+str(r);A=2*r ","Users/user6/TEMP.TXT","single"))

Then Question can be set to Q