Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sage
Path: blob/develop/src/doc/ru/tutorial/programming.rst
4086 views
****************
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
****************

.. _section-loadattach:

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Sage
===================================

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Sage, записанныС Π²
ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» ``example.sage`` со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТаниСм:

.. skip

::

    print("Hello World")
    print(2^3)

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ``example.sage`` с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ``load``.

.. skip

::

    sage: load("example.sage")
    Hello World
    8

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» Sage ΠΊ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ сСссии Π² ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
``attach``:

.. skip

::

    sage: attach("example.sage")
    Hello World
    8

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ссли Π²Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» ``example.sage`` ΠΈ Π²Π²Π΅Π΄Π΅Ρ‚Π΅ ΠΏΡƒΡΡ‚ΡƒΡŽ строку Π²
Sage (Ρ‚.Π΅. Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ``return``), Ρ‚ΠΎ содСрТимоС ``example.sage`` Π±ΡƒΠ΄Π΅Ρ‚
автоматичСски ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½ΠΎ Π² Sage.

Π’ частности, ``attach`` автоматичСски ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Ρ„Π°ΠΉΠ», ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½
ΠΈΠ·ΠΌΠ΅Π½Π΅Π½, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΈ поискС ошибок Π² ΠΊΠΎΠ΄Π΅, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ``load``
Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Ρ„Π°ΠΉΠ» лишь Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹.

Когда ``example.sage`` загруТаСтся Π² Sage, ΠΎΠ½ пСрСводится Π² Python, Π°
Π·Π°Ρ‚Π΅ΠΌ выполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python. Π—Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° Π΄Π°Π½Π½ΡƒΡŽ
ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹; Π² основном, это Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Ρ†Π΅Π»Ρ‹Ρ… констант Π²
``Integer()``, Π΄Ρ€ΠΎΠ±Π½Ρ‹Ρ… констант Π² ``RealNumber()``, Π·Π°ΠΌΠ΅Π½Ρƒ ``^`` Π½Π° ``**`` ΠΈ,
Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ``R.2`` Π½Π° ``R.gen(2)``. ΠŸΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π½Π°Ρ вСрсия ``example.sage`` Π±ΡƒΠ΄Π΅Ρ‚
ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ``example.sage``, ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ
``example.sage.py``. Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

::

    print("Hello World")
    print(Integer(2)**Integer(3))

Π¦Π΅Π»Ρ‹Π΅ контстанты ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Ρ‹ ΠΈ ``^`` Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π° ``**``. (Π’ Python ``^``
ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ "ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜" ΠΈ ``**`` ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ "Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ".)

Π”Π°Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² ``sage/misc/interpreter.py``.)

Π’Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ многострочный ΠΊΠΎΠ΄ с отступами Π² Sage Π΄ΠΎ
Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π΅ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ строки для Π½ΠΎΠ²Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² (это Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ для
Ρ„Π°ΠΉΠ»ΠΎΠ²). Однако, Π»ΡƒΡ‡ΡˆΠΈΠΌ способом для вставки Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° являСтся сохранСниС
Π² Ρ„Π°ΠΉΠ» ΠΈ использованиС ``attach``, ΠΊΠ°ΠΊ описано Π²Ρ‹ΡˆΠ΅.

.. _section-compile:

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°
==============================

Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ β€” ваТная ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ Π² матСматичСских вычислСниях. Π₯отя Python
являСтся высокоуровнСвым языком программирования, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вычислСния ΠΌΠΎΠ³ΡƒΡ‚
Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ Π½Π° нСсколько порядков быстрСС Π² Python ΠΏΡ€ΠΈ использовании
статичСских Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. НСкоторыС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Sage Π±Ρ‹Π»ΠΈ
Π±Ρ‹ слишком ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΌΠΈ, Π±ΡƒΠ΄ΡŒ ΠΎΠ½ написан Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π½Π° Python. Для этого Sage
ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ "Π²Π΅Ρ€ΡΠΈΡŽ" Python, которая называСтся Cython
([Cyt]_ ΠΈ [Pyr]_). Cython ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡ…ΠΎΠΆ ΠΈ Π½Π° Python, ΠΈ Π½Π° C. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ
конструкций Python, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ прСдставлСниС списков, условныС выраТСния, ΠΊΠΎΠ΄
Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ ``+=``, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹; Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, написанный Π²
Π΄Ρ€ΡƒΠ³ΠΈΡ… модулях Python. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
C ΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ C. ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ сконвСртирован Π²
C ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ компилятором C.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Π² Sage, ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ
``.spyx`` (вмСсто ``.sage``). Если Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с интСрфСйсом ΠΊΠΎΠΌΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки,
Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»ΡΡ‚ΡŒ ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ
ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ (Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΊΠΎΠ΄Π° Π½Π° Cython Π½Π΅
поддСрТиваСтся Π² интСрфСйсС Notebook). Π‘Π°ΠΌΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ происходит
"Π·Π° кулисами", Π½Π΅ трСбуя ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ дСйствий с вашСй стороны. 
ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΠ±Ρ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²
содСрТится Π² ``$HOME/.sage/temp/hostname/pid/spyx``. Π­Ρ‚ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹
ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Sage.

ΠŸΡ€Π΅-парсировка Π½Π΅ примСняСтся ΠΊ spyx Ρ„Π°ΠΉΠ»Π°ΠΌ. НапримСр ``1/3`` прСвратится Π²
0 Π² spyx Ρ„Π°ΠΉΠ»Π΅ вмСсто Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ числа :math:`1/3`. Допустим, ``foo`` -
это функция Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Sage. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ ΠΈΠ· spyx-Ρ„Π°ΠΉΠ»Π°,
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ``sage.all`` ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ``sage.all.foo``.

::

    import sage.all
    def foo(n):
        return sage.all.factorial(n)

Доступ ΠΊ функциям Π‘ ΠΈΠ· Π²Π½Π΅ΡˆΠ½ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ²
-------------------------------------

Доступ ΠΊ функциям C ΠΈΠ· Π²Π½Π΅ΡˆΠ½ΠΈΡ… ``*.c`` Ρ„Π°ΠΉΠ»ΠΎΠ² осущСствляСтся довольно просто.
Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ``test.c`` ΠΈ ``test.spyx`` Π² ΠΎΠ΄Π½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ
содСрТаниСм:

Код Π½Π° языкС Π‘: ``test.c``

::

    int add_one(int n) {
      return n + 1;
    }

Код Π½Π° языкС Cython: ``test.spyx``:

::

    cdef extern from "test.c":
        int add_one(int n)

    def test(n):
        return add_one(n)

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅:

.. skip

::

    sage: attach("test.spyx")
    Compiling (...)/test.spyx...
    sage: test(10)
    11

Π’ Ρ‚ΠΎΠΌ случаС, Ссли понадобится Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ``foo`` для Ρ‚ΠΎΠ³ΠΎ,
Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° C, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° Cython, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅
``clib foo`` Π² источник Cython ΠΊΠΎΠ΄Π°. Аналогично, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π‘ Ρ„Π°ΠΉΠ» ``bar``
ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ с объявлСниСм ``cfile bar``.

.. _section-standalone:

Π‘Π°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ скрипты Python/Sage
===================================

Π”Π°Π½Π½Ρ‹ΠΉ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ скрипт Sage раскладываСт Π½Π° ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΠΈ Ρ†Π΅Π»Ρ‹Π΅ числа,
ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΡ‹ ΠΈ Ρ‚.Π΄.:

::

    #!/usr/bin/env sage

    import sys

    if len(sys.argv) != 2:
        print("Usage: %s <n>" % sys.argv[0])
        print("Outputs the prime factorization of n.")
        sys.exit(1)

    print(factor(sage_eval(sys.argv[1])))

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот скрипт, ``SAGE_ROOT`` Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² PATH.
Если Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ скрипт называСтся ``factor``, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ
Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ:

::

    bash $ ./factor 2006
    2 * 17 * 59

Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…
===========

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Sage ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. Python Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя большой
спСктр встроСнных Ρ‚ΠΈΠΏΠΎΠ² Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Sage Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Π΅Ρ‰Π΅ большС.
ВстроСнныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Python Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ строки, списки,
ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, Ρ†Π΅Π»Ρ‹Π΅ ΠΈ Π΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ числа:

::

    sage: s = "sage"; type(s)
    <... 'str'>
    sage: s = 'sage'; type(s)      # Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ
    <... 'str'>
    sage: s = [1,2,3,4]; type(s)
    <... 'list'>
    sage: s = (1,2,3,4); type(s)
    <... 'tuple'>
    sage: s = int(2006); type(s)
    <... 'int'>
    sage: s = float(2006); type(s)
    <... 'float'>

Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Sage добавляСт ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅:

::

    sage: V = VectorSpace(QQ, 1000000); V
    Vector space of dimension 1000000 over Rational Field
    sage: type(V)
    <class 'sage.modules.free_module.FreeModule_ambient_field_with_category'>

Волько ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΊ ``V``. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… матСматичСских
ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈΡΡŒ Π±Ρ‹ Π² "Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ" Π²ΠΈΠ΄Π΅: ``foo(V,...)``. Π’ Sage
ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½Ρ‹ ΠΊ Ρ‚ΠΈΠΏΡƒ (ΠΈΠ»ΠΈ классу) ``V`` ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ синтаксиса, ΠΊΠ°ΠΊ Π² Java ΠΈΠ»ΠΈ C++, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,
``V.foo(...)``. Π­Ρ‚ΠΎ способствуСт Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ имСнная ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π½Π΅
захламляСтся дСсятками тысяч Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Ρ€Π°Π·Π½Ρ‹ΠΌ
содСрТаниСм ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°Π·Π²Π°Π½Ρ‹ "foo" Π±Π΅Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’Π°ΠΊΠΆΠ΅,
Ссли Π’Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, эта функция всС Ρ€Π°Π²Π½ΠΎ доступна
(Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли Π’Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ ``zeta``, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅
Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Riemann-Zeta ΠΏΡ€ΠΈ 0.5, Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ
``s=.5; s.zeta()``).

::

    sage: zeta = -1
    sage: s=.5; s.zeta()
    -1.46035450880959

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ случаях, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
Ρ‚Π°ΠΊΠΆΠ΅ способствуСт удобству ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ матСматичСскиС выраТСния ΠΌΠΎΠ³ΡƒΡ‚
Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½ΠΎ ΠΏΡ€ΠΈ исаользовании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ обозначСния.
НапримСр:

::

    sage: n = 2; n.sqrt()
    sqrt(2)
    sage: sqrt(2)
    sqrt(2)
    sage: V = VectorSpace(QQ,2)
    sage: V.basis()
        [(1, 0), (0, 1)]
    sage: basis(V)
        [(1, 0), (0, 1)]
    sage: M = MatrixSpace(GF(7), 2); M
    Full MatrixSpace of 2 by 2 dense matrices over Finite Field of size 7
    sage: A = M([1,2,3,4]); A
    [1 2]
    [3 4]
    sage: A.charpoly('x')
    x^2 + 2*x + 5
    sage: charpoly(A, 'x')
    x^2 + 2*x + 5

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ всС Ρ‡Π»Π΅Π½Ρ‹-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для :math:`A`, Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΠΉΡ‚Π΅ ``A.``,
Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ ``[tab]`` Π½Π° Π’Π°ΡˆΠ΅ΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅, ΠΊΠ°ΠΊ описано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅
:ref:`section-tabcompletion`

Бписки, ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
====================================

Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… список ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² сСбС элСмСнты Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. Как Π² C,
C++ ΠΈ Ρ‚.Π΄., Π½ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… алгСбраичСских систСм, элСмСнты списка
Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с индСкса :math:`0`:

::

    sage: v = [2, 3, 5, 'x', SymmetricGroup(3)]; v
    [2, 3, 5, 'x', Symmetric group of order 3! as a permutation group]
    sage: type(v)
    <... 'list'>
    sage: v[0]
    2
    sage: v[2]
    5

ΠŸΡ€ΠΈ индСксировании списка, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ индСксов, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ Ρ†Π΅Π»Ρ‹ΠΌ числом
Python, сработаСт Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ.

::

    sage: v = [1,2,3]
    sage: v[2]
    3
    sage: n = 2      # Ρ†Π΅Π»ΠΎΠ΅ число Sage
    sage: v[n]       # Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ
    3
    sage: v[int(n)]  # Ρ‚ΠΎΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ
    3

Ѐункция ``range`` создаСт список Ρ†Π΅Π»Ρ‹Ρ… чисСл, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Python(Π½Π΅ Sage):

::

    sage: list(range(1, 15))
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° для создания списков ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΠΈΠ΄ списка:

::

    sage: L = [factor(n) for n in range(1, 15)]
    sage: L
    [1, 2, 3, 2^2, 5, 2 * 3, 7, 2^3, 3^2, 2 * 5, 11, 2^2 * 3, 13, 2 * 7]
    sage: L[12]
    13
    sage: type(L[12])
    <class 'sage.structure.factorization_integer.IntegerFactorization'>
    sage: [factor(n) for n in range(1, 15) if is_odd(n)]
    [1, 3, 5, 7, 3^2, 11, 13]

Для большСго понимания списков см. [PyT]_.

РасщСплСниС списков - это ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ инструмСнт. Допустим ``L`` - это
список, Ρ‚ΠΎΠ³Π΄Π° ``L[m:n]`` Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΏΠΎΠ΄-список L, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ, начиная с
элСмСнта Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ :math:`m` ΠΈ заканчивая элСмСнтом Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ :math:`(n-1)`,
ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

::

    sage: L = [factor(n) for n in range(1, 20)]
    sage: L[4:9]
    [5, 2 * 3, 7, 2^3, 3^2]
    sage: L[:4]
    [1, 2, 3, 2^2]
    sage: L[14:4]
    []
    sage: L[14:]
    [3 * 5, 2^4, 17, 2 * 3^2, 19]

ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ сходство со списками, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΈ нСизмСняСмы с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° создания.

::

    sage: v = (1,2,3,4); v
    (1, 2, 3, 4)
    sage: type(v)
    <... 'tuple'>
    sage: v[1] = 5
    Traceback (most recent call last):
    ...
    TypeError: 'tuple' object does not support item assignment

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ - это Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, схоТий ΠΏΠΎ свойствам со списком.
ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ встроСны Π² Python Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ списков
ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ являСтся измСняСмой, ΠΎΠ΄Π½Π°ΠΊΠΎ
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ ``set_immutable`` ΠΈΠ· класса ``Sequence``, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ
сдСлана нСизмСняСмой, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. ВсС элСмСнты
ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ родитСля, ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΠΎΠ³ΠΎ унивСрсумом
ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠΎΡΡ‚ΠΈ.

::

    sage: v = Sequence([1,2,3,4/5])
    sage: v
    [1, 2, 3, 4/5]
    sage: type(v)
    <class 'sage.structure.sequence.Sequence_generic'>
    sage: type(v[1])
    <class 'sage.rings.rational.Rational'>
    sage: v.universe()
    Rational Field
    sage: v.is_immutable()
    False
    sage: v.set_immutable()
    sage: v[0] = 3
    Traceback (most recent call last):
    ...
    ValueError: object is immutable; please change a copy instead.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ списки:

::

    sage: v = Sequence([1,2,3,4/5])
    sage: isinstance(v, list)
    True
    sage: list(v)
    [1, 2, 3, 4/5]
    sage: type(list(v))
    <... 'list'>

Базис для Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ поля являСтся нСизмСняСмой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, Ρ‚Π°ΠΊ
ΠΊΠ°ΠΊ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ…. Π­Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

::

    sage: V = QQ^3; B = V.basis(); B
    [(1, 0, 0), (0, 1, 0), (0, 0, 1)]
    sage: type(B)
    <class 'sage.structure.sequence.Sequence_generic'>
    sage: B[0] = B[1]
    Traceback (most recent call last):
    ...
    ValueError: object is immutable; please change a copy instead.
    sage: B.universe()
    Vector space of dimension 3 over Rational Field

Π‘Π»ΠΎΠ²Π°Ρ€ΠΈ
=======

Π‘Π»ΠΎΠ²Π°Ρ€ΡŒ (Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΡ‹ΠΉ ассоциативным массивом) - это сопоставлСниС
'Ρ…ΡΡˆΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ…' ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (ΠΊΠ°ΠΊ строки, числа ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΈΠ· Π½ΠΈΡ…; см. Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ
Python: http://docs.python.org/3/tutorial/datastructures.html ΠΈ
https://docs.python.org/3/library/stdtypes.html#typesmapping) ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ.

::

    sage: d = {1:5, 'sage':17, ZZ:GF(7)}
    sage: type(d)
    <... 'dict'>
    sage: list(d.keys())
    [1, 'sage', Integer Ring]
    sage: d['sage']
    17
    sage: d[ZZ]
    Finite Field of size 7
    sage: d[1]
    5

Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΊΠ»ΡŽΡ‡ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ индСксы словаря ΠΌΠΎΠ³Ρƒ Π±Ρ‹Ρ‚ΡŒ слоТными, ΠΊΠ°ΠΊ,
Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ»ΡŒΡ†ΠΎ Ρ†Π΅Π»Ρ‹Ρ… чисСл.

МоТно ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π² список с Ρ‚Π΅ΠΌ ΠΆΠ΅ содСрТимым:

.. link

::

    sage: list(d.items())
    [(1, 5), ('sage', 17), (Integer Ring, Finite Field of size 7)]

Часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ являСтся ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠΎ ΠΏΠ°Ρ€Π°ΠΌ Π² словарС:

::

    sage: d = {2:4, 3:9, 4:16}
    sage: [a*b for a, b in d.items()]
    [8, 27, 64]

Как ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ послСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π½Π΅ упорядочСн.

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π°
=========

Π’ Python Π΅ΡΡ‚ΡŒ встроСнный Ρ‚ΠΈΠΏ мноТСство. Π“Π»Π°Π²Π½Ρ‹ΠΌ прСимущСством этого Ρ‚ΠΈΠΏΠ°
являСтся быстрый просмотр, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ элСмСнт мноТСству,
Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ· Ρ‚Π΅ΠΎΡ€ΠΈΠΈ мноТСств.

::

    sage: X = set([1,19,'a']);   Y = set([1,1,1, 2/3])
    sage: X   # random sort order
    {1, 19, 'a'}
    sage: X == set(['a', 1, 1, 19])
    True
    sage: Y
    {2/3, 1}
    sage: 'a' in X
    True
    sage: 'a' in Y
    False
    sage: X.intersection(Y)
    {1}

Π’ Sage Ρ‚Π°ΠΊΠΆΠ΅ имССтся свой Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… мноТСство, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ (Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях)
осущСствлСн с использованиСм встроСнного Ρ‚ΠΈΠΏΠ° мноТСство Python, Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²
сСбя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с Sage. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ мноТСство Sage с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
``Set(...)``. НапримСр,

::

    sage: X = Set([1,19,'a']);   Y = Set([1,1,1, 2/3])
    sage: X   # random sort order
    {'a', 1, 19}
    sage: X == Set(['a', 1, 1, 19])
    True
    sage: Y
    {1, 2/3}
    sage: X.intersection(Y)
    {1}
    sage: print(latex(Y))
    \left\{1, \frac{2}{3}\right\}
    sage: Set(ZZ)
    Set of elements of Integer Ring

Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹
=========

Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ - это ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Π΄Π°Π²Π½Π΅Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² Python, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся
ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ Π² матСматичСских прилоТСниях. НСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² использования
ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½ΠΈΠΆΠ΅; ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. [PyT]_. Π—Π΄Π΅ΡΡŒ создаСтся ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€
для ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… чисСл Π΄ΠΎ :math:`10000000`.

::

    sage: v = (n^2 for n in range(10000000))
    sage: next(v)
    0
    sage: next(v)
    1
    sage: next(v)
    4

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ - созданиС ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΠ· простых чисСл Π²ΠΈΠ΄Π° :math:`4p+1` с
простым :math:`p` ΠΈ просмотр Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

::

    sage: w = (4*p + 1 for p in Primes() if is_prime(4*p+1))
    sage: w         # random output Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС 0xb0853d6c ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚ΠΈΡ€ΠΈΡ‡Π½Ρ‹ΠΌ числом
    <generator object at 0xb0853d6c>
    sage: next(w)
    13
    sage: next(w)
    29
    sage: next(w)
    53

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠ»ΡŒΡ†Π°, ΠΊΠ°ΠΊ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ поля ΠΈ Ρ†Π΅Π»Ρ‹Π΅ числа, ΠΈΠΌΠ΅ΡŽΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹:

::

    sage: [x for x in GF(7)]
    [0, 1, 2, 3, 4, 5, 6]
    sage: W = ((x,y) for x in ZZ for y in ZZ)
    sage: next(W)
    (0, 0)
    sage: next(W)
    (0, 1)
    sage: next(W)
    (0, -1)

Π¦ΠΈΠΊΠ»Ρ‹, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ конструкции ΠΈ сравнСния
===================================================

ΠœΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² с использованиСм Ρ†ΠΈΠΊΠ»ΠΎΠ² ``for``. Π’ Python
Ρ†ΠΈΠΊΠ» ``for`` ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π°Π±ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ структуру:

::

    >>> for i in range(5):
    ...     print(i)
    ...
    0
    1
    2
    3
    4

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½Ρ†Π΅ выраТСния("do" ΠΈΠ»ΠΈ "od", ΠΊΠ°ΠΊ GAP ΠΈΠ»ΠΈ Maple, Π½Π΅
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ), Π° отступы ΠΏΠ΅Ρ€Π΅Π΄ "Ρ‚Π΅Π»ΠΎΠΌ" Ρ†ΠΈΠΊΠ»Π°, Π² частности, ΠΏΠ΅Ρ€Π΅Π΄ ``print(i)``.
Π­Ρ‚ΠΈ отступы Π²Π°ΠΆΠ½Ρ‹. Π’ Sage отступы ставятся автоматичСски ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ``enter``
послС ":", как показано ниТС.

::

    sage: for i in range(5):
    ....:     print(i)  # Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Enter Π΄Π²Π°ΠΆΠ΄Ρ‹
    ....:
    0
    1
    2
    3
    4


Π‘ΠΈΠΌΠ²ΠΎΠ» ``=`` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для присваивания.
Π‘ΠΈΠΌΠ²ΠΎΠ» ``==`` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ равСнства:

::

    sage: for i in range(15):
    ....:     if gcd(i,15) == 1:
    ....:         print(i)
    1
    2
    4
    7
    8
    11
    13
    14

Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, ΠΊΠ°ΠΊ табуляция опрСдСляСт структуру Π±Π»ΠΎΠΊΠΎΠ² для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ``if``,
``for`` ΠΈ ``while``:

::

    sage: def legendre(a,p):
    ....:     is_sqr_modp=-1
    ....:     for i in range(p):
    ....:         if a % p == i^2 % p:
    ....:             is_sqr_modp=1
    ....:     return is_sqr_modp

    sage: legendre(2,7)
    1
    sage: legendre(3,7)
    -1

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, это Π½Π΅ эффСктивная рСализация символа Π›Π΅ΠΆΠ°Π½Π΄Ρ€Π°! Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ слуТит
лишь ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Ρ€Π°Π·Π½Ρ‹Ρ… аспСктов программирования Π² Python/Sage. Ѐункция
{kronecker}, встроСнная Π² Sage, подсчитываСт символ Π›Π΅ΠΆΠ°Π½Π΄Ρ€Π° эффСктивно с
использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ C, Π² частности, с использованиСм PARI.

БравнСния ``==``, ``!=``, ``<=``, ``>=``, ``>``, ``<`` ΠΌΠ΅ΠΆΠ΄Ρƒ числами
автоматичСски пСрСводят ΠΎΠ±Π° Ρ‡Π»Π΅Π½Π° Π² ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ:

::

    sage: 2 < 3.1; 3.1 <= 1
    True
    False
    sage: 2/3 < 3/2;   3/2 < 3/1
    True
    True

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ bool для ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… нСравСнств:

::

    sage: x < x + 1
    x < x + 1
    sage: bool(x < x + 1)
    True

ΠŸΡ€ΠΈ сравнСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Sage попытаСтся
Π½Π°ΠΉΡ‚ΠΈ каноничСскоС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠΈΡ… ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽ. ΠŸΡ€ΠΈ успСхС, сравнСниС
выполняСтся ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ; Ссли Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ расцСнСны
ΠΊΠ°ΠΊ Π½Π΅Ρ€Π°Π²Π½Ρ‹Π΅. Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ равСнства Π΄Π²ΡƒΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ``is``. НапримСр:

::

    sage: 1 is 2/2
    False
    sage: 1 is 1
    False
    sage: 1 == 2/2
    True

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Π²ΡƒΡ… строках ΠΏΠ΅Ρ€Π²ΠΎΠ΅ нСравСнство Π΄Π°Π΅Ρ‚ ``False``, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅Ρ‚
каноничСского ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° :math:`\QQ\to \GF{5}`, поэтому Π½Π΅ сущСствуСт
каноничСского сравнСния ΠΌΠ΅ΠΆΠ΄Ρƒ :math:`1` Π² :math:`\GF{5}` ΠΈ :math:`1 \in \QQ`.
Однако, сущСствуСт каноничСскоС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ :math:`\ZZ \to \GF{5}`, поэтому
Π²Ρ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π°Π΅Ρ‚ ``True``. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, порядок Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния.

::

    sage: GF(5)(1) == QQ(1); QQ(1) == GF(5)(1)
    False
    False
    sage: GF(5)(1) == ZZ(1); ZZ(1) == GF(5)(1)
    True
    True
    sage: ZZ(1) == QQ(1)
    True

Π’ΠΠ˜ΠœΠΠΠ˜Π•: Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π² Sage проводится Π±ΠΎΠ»Π΅Π΅ Тёстко, Ρ‡Π΅ΠΌ Π² Magma, которая ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚
:math:`1 \in \GF{5}` Ρ€Π°Π²Π½Ρ‹ΠΌ :math:`1 \in \QQ`.

::

    sage: magma('GF(5)!1 eq Rationals()!1')            # optional - magma
    true

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
==============

Автор Ρ€Π°Π·Π΄Π΅Π»Π°: Martin Albrecht ([email protected])

    "ΠŸΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ оптимизация - это ΠΊΠΎΡ€Π΅Π½ΡŒ всСго Π·Π»Π°." - Π”ΠΎΠ½Π°Π»ΡŒΠ΄ ΠšΠ½ΡƒΡ‚

Часто ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° слабыС мСста, ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ части
ΠΎΡ‚Π½ΠΈΠΌΠ°ΡŽΡ‚ наибольшСС врСмя Π½Π° вычислСния; Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅
части ΠΊΠΎΠ΄Π° Π½Π°Π΄ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Python ΠΈ Sage прСдоставляСт нСсколько
возмоТностСй для профилирования (Ρ‚Π°ΠΊ называСтся этот процСсс).

Π‘Π°ΠΌΡ‹ΠΉ Π»Π΅Π³ΠΊΠΈΠΉ ΠΏΡƒΡ‚ΡŒ - это использованиС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ``prun``. Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΡ€Π°Ρ‚ΠΊΡƒΡŽ
ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠ΅ врСмя ΠΎΡ‚Π½ΠΈΠΌΠ°Π΅Ρ‚ каТдая функция. Π”Π°Π»Π΅Π΅ слСдуСт ΠΏΡ€ΠΈΠΌΠ΅Ρ€
умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΠΈΠ· ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ:

::

    sage: k,a = GF(2**8, 'a').objgen()
    sage: A = Matrix(k,10,10,[k.random_element() for _ in range(10*10)])

.. skip

::

    sage: %prun B = A*A
           32893 function calls in 1.100 CPU seconds

    Ordered by: internal time

    ncalls tottime percall cumtime percall filename:lineno(function)
     12127  0.160   0.000   0.160  0.000 :0(isinstance)
      2000  0.150   0.000   0.280  0.000 matrix.py:2235(__getitem__)
      1000  0.120   0.000   0.370  0.000 finite_field_element.py:392(__mul__)
      1903  0.120   0.000   0.200  0.000 finite_field_element.py:47(__init__)
      1900  0.090   0.000   0.220  0.000 finite_field_element.py:376(__compat)
       900  0.080   0.000   0.260  0.000 finite_field_element.py:380(__add__)
         1  0.070   0.070   1.100  1.100 matrix.py:864(__mul__)
      2105  0.070   0.000   0.070  0.000 matrix.py:282(ncols)
      ...

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ``ncalls`` - это количСство Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ``tottime`` - это
ΠΎΠ±Ρ‰Π΅Π΅ врСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² суб-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ), ``percall`` - это ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ``tottime`` ΠΊ ``ncalls``.
``cumtime`` - это ΠΎΠ±Ρ‰Π΅Π΅ врСмя, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π² этой ΠΈ всСх суб-функциях,
``percall`` - это ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ``cumtime`` ΠΊ числу ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²,
``filename:lineno(function)`` прСдоставляСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
Π§Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ функция находится Π² этом спискС, Ρ‚Π΅ΠΌ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ½Π° ΠΎΡ‚Π½ΠΈΠΌΠ°Π΅Ρ‚.

``prun?`` ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ профилирования ΠΈ
ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π΅ использования.

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ информация ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вписана Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ
изучСния:

.. skip

::

    sage: %prun -r A*A
    sage: stats = _
    sage: stats?

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°: Π²Π²ΠΎΠ΄ ``stats = prun -r A\*A`` ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ρ‚Π°ΠΊ
ΠΊΠ°ΠΊ ``prun`` - это ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ IPython, Π° Π½Π΅ обычная функция.

Для графичСского отобраТСния ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
hotshot - нСбольшой скрипт, Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΉ hotshot2cachetree ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ``kcachegrind``
(Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Unix). TΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с использованиСм hotshot:

.. skip

::

    sage: k,a = GF(2**8, 'a').objgen()
    sage: A = Matrix(k,10,10,[k.random_element() for _ in range(10*10)])
    sage: import hotshot
    sage: filename = "pythongrind.prof"
    sage: prof = hotshot.Profile(filename, lineevents=1)

.. skip

::

    sage: prof.run("A*A")
    <hotshot.Profile instance at 0x414c11ec>
    sage: prof.close()

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ Π² Ρ„Π°ΠΉΠ» ``pythongrind.prof`` Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ
Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. Для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ эта информация ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚
cachegrind.

Π’ систСмной ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ Π²Π²Π΅Π΄ΠΈΡ‚Π΅

.. skip

::

    hotshot2calltree -o cachegrind.out.42 pythongrind.prof

Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» ``cachegrind.out.42`` Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
``kcachegrind``. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ``cachegrind.out.XX`` Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ
соблюдСно.