Разные способы определения функции в Sagemath - PullRequest
0 голосов
/ 01 марта 2019

Я хотел бы знать, почему эти две "программы" выдают различный вывод

    f(x)=x^2
    f(90).mod(7)

и

    def f(x):
        return(x^2)
    f(90).mod(7)

Спасибо

1 Ответ

0 голосов
/ 03 марта 2019

Отличный вопрос!Давайте более подробно рассмотрим рассматриваемые функции.

f(x)=x^2
def g(x):
    return(x^2)

print type(g(90))
print type(f(90))

Это дает

<type 'sage.rings.integer.Integer'>
<type 'sage.symbolic.expression.Expression'>

Итак, вы видите разницу между символической определенной функциейс нотацией f(x) и функцией Python с использованием ключевого слова def.В Sage у первого есть доступ ко многим вещам (например, исчислению), которых у простых старых Sage не будет.

В этом случае я бы порекомендовал, просто для того, что вам нужно,

sage: a = f(90)
sage: ZZ(a).mod(7)
1

или, возможно, более надежный

sage: mod(a,7)
1

Более длинное объяснение.

Для символических вещей mod не то, что вы думаете.На самом деле, я не уверен, что это что-то сделает (см. Документацию по mod, чтобы узнать, как использовать его для полиномиальной модульной работы над идеалами).Вот код (доступный с x.mod??, документация доступная с x.mod?):

    from sage.rings.ideal import is_Ideal
    if not is_Ideal(I) or not I.ring() is self._parent:
        I = self._parent.ideal(I)
        #raise TypeError, "I = %s must be an ideal in %s"%(I, self.parent())
    return I.reduce(self)

И получается, что для родовых колец (как символическое «кольцо») ничего не происходит на этом последнем шаге:

return f 

Вот почему нам нужно, так или иначе, попросить, чтобы оно снова было целым числом.См. Trac 27401 .

...