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