Sage - bardzo interesujący program wspomagający obliczenia matematyczne, które entuzjastycznie opisywałem jakiś czas temu - jest już dostępny w formie pakietów Ubuntu. Zamiast dość kłopotliwej instalacji, wystarczy
$ sudo apt-get install sagemath
Instaluje się wersja sprzed około roku - 3.0.5, (aktualną jest wydana miesiąc temu 4.1.1, seria 3 doszła do 3.4.2), do nauki i podstawowego wykorzystywania jest ona zupełnie wystarczająca.
O zmianach, które spowodowały zmianę dużego numeru wersji, można poczytać tutaj. Rewolucja jest bardziej wewnętrzna, niż użytkowa.
Oczywiście każde wydanie niesie ze sobą rozmaite poprawki i uzupełnienia, dotyczą one jednak głównie konkretnych modułów. Począwszy od wersji 3.2.3 omówienia zmian są dostępne tutaj:
Informacje o starszych wersjach można znaleźć na liście sage-announce.
Uwaga: instalacja z pakietów ciągle wymaga trochę czasu, miejsca i pasma - ściąga się 100-200 megabajtów. Mimo wszystko, jest to zauważalna oszczędność w stosunku do niezależnej instalacji - wykorzystywana jest systemowa wersja Pythona, wiele systemowych bibliotek i narzędzi.
$ sudo apt-get install sagemath Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: gap gap-character-tables gap-core gap-dev gap-doc gap-guava gap-libs gap-online-help gap-prim-groups gap-small-groups gap-trans-groups genus2reduction gfan gmp-ecm lcalc libboost-python1.34.1 libcdd-test libcdd0 libdsdp-5.8gf libecm0 libflint-1.011 libfplll0 libgivaro0 libiml0 liblinbox0 libm4ri-0.0.20080521 libmpfi0 libntl-5.4.2 libpari2-gmp libpolybori-0.5.0-0 libpolybori-dev libqd2c2a libsingular-3-0-4-3 libsingular-dev libsymmetrica-2.0 libzn-poly-0.8 maxima maxima-share palp pari-extra pari-gp python-cvxopt python-gd python-gnuplot python-gnutls python-networkx python-polybori python-processing python-sympy python-zodb scons singular sympow tachyon Suggested packages: gap-small-groups-extra gap-table-of-marks maxima-doc texmacs pari-doc pari-gp2c python-gd-dbg valgrind The following NEW packages will be installed gap gap-character-tables gap-core gap-dev gap-doc gap-guava gap-libs gap-online-help gap-prim-groups gap-small-groups gap-trans-groups genus2reduction gfan gmp-ecm lcalc libboost-python1.34.1 libcdd-test libcdd0 libdsdp-5.8gf libecm0 libflint-1.011 libfplll0 libgivaro0 libiml0 liblinbox0 libm4ri-0.0.20080521 libmpfi0 libntl-5.4.2 libpari2-gmp libpolybori-0.5.0-0 libpolybori-dev libqd2c2a libsingular-3-0-4-3 libsingular-dev libsymmetrica-2.0 libzn-poly-0.8 maxima maxima-share palp pari-extra pari-gp python-cvxopt python-gd python-gnuplot python-gnutls python-networkx python-polybori python-processing python-sympy python-zodb sagemath scons singular sympow tachyon Need to get 141MB of archives. After this operation, 520MB of additional disk space will be used. Do you want to continue [Y/n]?
Zauważyłem jeden, dość dziwny, problem - nie działa wywoływanie pomocy znakiem zapytania:
sage: simplify? --------------------------------------------------------- NameError Traceback (most recent call last) ... NameError: global name '_os' is not defined
Niedogodność jest drobna, bo help(obiekt-lub-funkcja)
działa:
sage: help(simplify) Help on function simplify in module sage.calculus.functional: simplify(f) Simplify the expression $f$. ...
By ten artykuł nie pozostał stricte newsowym, drobny przykład użycia Sage.
Poniższe dość niesympatyczne rachunki pomogły mi rozwiązać jedno
z zadanek z projecteuler.
Sam rachunek nie jest szczególnie frapujący, cytując go chcę pokazać,
jak można definiować symbole dla funkcji i jak rozwiązywać
równania w celu wyprowadzenia wzoru na funkcję (poniżej q(a,b)
występuje z obu stron równania,
dzięki solve
zostaje ono przekształcone tak, by wyprowadzić wzór na q(a,b)
).
sage: var("a,b") (a, b) sage: T = function('T', b) sage: p = function('p', a, b) sage: q = function('q', a, b) sage: print solve( ...: q(a,b) == 1/2^T(b) * p(a, b - 2^(T(b)-1) ) \ ...: + (2^T(b) - 1)/2^T(b) * (1/2 * q(a-1, b) + 1/2 * q(a,b)) , ...: q(a,b) ) [ T(b) T(b) - 1 q(a - 1, b) 2 + 2 p(a, b - 2 ) - q(a - 1, b) q(a, b) == ------------------------------------------------------- T(b) 2 + 1 ]