****************
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
****************
.. _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`` Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ
ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΎ.