728 x 90

, i

SAGE Math, potęga matematyki zamknięta w przeglądarce

SAGE Math, potęga matematyki zamknięta w przeglądarce

Ostatni artykuł wprowadzający was do nowoczesnego języka programowania jakim jest Julia okazał się sukcesem. Tym razem postaramy się wam przybliżyć inne matematyczne narzędzie używane do kryptologicznych zadań. A jest nim Sage Math.  Jest to matematyczne narzędzie, którego możemy używać  za pomocą wersji online z przeglądarki, lub instalując oprogramowanie i uruchamiając wirtualną maszynę. Na potrzeby tego artykułu wykorzystamy tę pierwszą wersję.  Spójrzmy jednak jakie korzyści daje nam Sage. Jest to oprogramowanie oparte na licencji GNU General Public License. Z założenia jest alternatywą dla projektów takich jak Magma, Maple, Mathematica czy Matlab. Droga tego potężnego narzędzie rozpoczęła się w 2005 roku, i przez  te 12 lat może poszczycić się naprawdę dużymi osiągnięciami, z zakresu nauk matematycznych. Warto wiedzieć, że do sprawnego używania kalkulatora trzeba zapoznać się z przynajmniej podstawową składnią Pythona.

Zacznijmy od przejścia na stronę http://www.sagemath.org/ i przejścia do zakładki CoCalc (SageMathCloud) i kliknięciu Run CoCalc. Po zalogowaniu, tworzymy nowego workspace’a.

1.       Podstawowe operacje matematyczne

Aby dodać dwie liczby do siebie należy wpisać działanie, a następnie wcisnąć Ctrl+Enter

Podobnie działają wszystkie inne podstawowe matematyczne zagadnienia. Warto wspomnieć tu o ważnym dla kryptologii wyrażeniu modulo. Resztę z dzielenie oznaczamy znakiem %, zaś część całkowita //. Spójrzmy na przykład:

Aby uzyskać wartość logiczną wyrażenia, wystarczy wpisać je pamiętając, że znak równości oznaczany jest podwójnym znakiem równości ( == ): 

Kolejnym problemem z jakim może się spotkać początkowy użytkownik, to używanie poleceń, tak aby dawały one wyniki numeryczne, a nie były interpretowane jako tekst. Najlepiej widać to na przykładzie: 

2.       Pierwsze programy

Aby miło rozpocząć programowanie w Sage, zacznijmy od legendarnego Hello World.

W poprzednim podpunkcie dodawaliśmy dwie liczby do siebie jednak jest to mało przydatna opcja, ponieważ rzadko kiedy wiemy już na samym początku jakie dwie liczby dodamy. Dlatego wynik  możemy obliczyć i zapisać w zmiennej. W Sage nie deklaruje się typu zmiennej. Typ jest automatycznie dobierany podczas przypisania obiektu.  Zmienną możemy wyświetlić bez użycia polecenia print, tylko wywołując nazwę zmiennej.

Spójrzmy teraz jak ograniczyć ilość cyfr, które są wynikiem naszej operacji, bardzo dobrym przykładem jest liczba PI.

Ważnym elementem współczesnej kryptologii jest algebra liniowa, a dokładnie macierze, spójrzmy na ich obsługę. Aby zadeklarować macierz, należy użyć słowa kluczowego matrix oraz zdefiniować wartości na poszczególnych polach, rozmiar, oraz typ.

Podstawą każdego programu są funkcje, pozwalają one nie tylko na zwiększenie przejrzystości kodu, ale także na wielokrotne użycie wcześniej napisanej implementacji.  Każdą funkcje zaczynamy słowem kluczowym def, następnie podajemy nazwę oraz dwukropek

Jeśli podczas deklaracji funkcji przypiszemy do zmiennej wartość, będzie ona ustawiona jako defaultowa tzn. że nie musimy jej wpisywać podczas wywołania funkcji.

 

3.       Struktury danych

Elementem niezbędnym dla prawie każdego języka programowania są kolekcję. Przyjrzyjmy się jak zostały one zaimplementowane w Sage, a właściwie w języku Python. Sama deklaracja tablicy jest bardzo prosta, wystarczy podać nazwę oraz przypisać jej dwa nawiasy kwadratowe tzn. tablica = []. Warto pamiętać, że lista przechowuje obiekty tzn. nie musimy określać co przechowuje i w jaki sposób. W dokumentacji języka możemy znaleźć następujące funkcje:

– append(x) – dodawanie elementu na koniec struktury

– insert(x,y) – dodanie za element o indeksie x, wartości y

– remove(x) – usunięcie elementu x

– pop([i]) – usunięcie elementu o indeksie i

– index(x) – zwraca indeks pierwszego elementu x

– count(x) – zlicza ilość wystąpień elementu x

Warto też zwrócić uwagę, jak sprawdzić długość naszej struktury. Używamy do tego polecenia len(nazwa_struktury_danych). Natomiast aby sprawdzić czy dany element istnieje na liście zamiast count(x) możemy użyć polecenia in, które zwraca nam wartość boolowską np. 2 in nazwa_struktury_danych.

Możemy także ustawiać klucze dla danych wartości tworząc swego rodzaju odpowiednik słownika w języku Julia. Robimy to używając następującej struktury key:wartość

4.       Pętle

Pętle są bardzo ważnym elementem większości języków, najczęściej występującą jest pętla for, której składnia trochę różni się od tych znanych z języka C++ czy C. Aby użyć pętli musimy użyć następującej formuły:

for zmienna in zakres

Spójrzmy zatem na przykłady:

 

Druga implementacja jest trochę nieużyteczna, ponieważ to samo możemy zrobić wpisując samą nazwę tablicy, co spowoduje jej wyświetlenie, jednak warto zatrzymać się na tym przykładzie i go zapamiętać, gdyż bardzo często spotykamy się z przeglądem kolejnych elementów struktury danych.

Jeśli interesujecie się kryptologią, to na pewno znacie pojęcie ciała skończonego ( ciała Galoisa ), SAGE w bardzo prosty sposób pozwala na operacje w tym ciele. Aby zadeklarować ciało wystarczy zmienną przyrównać do symbolu GF(p), a jak wiemy p – jest liczbą pierwszą.

5.       Rozwiązywanie równań

Wiele razy oblicza się wartości pewnych zmiennych z danego równania, aby to zrobić w sposób prosty i przyjemny, wystarczy użyć polecenia solve(równanie, zmienna)

Możemy rozwiązywać także układy równań

6.       Rysowanie wykresów

Często potrzebujemy zwizualizować swoje matematyczne dzieło, aby to zrobić możemy stworzyć wykresy dwu lub trzy wymiarowe. Zacznijmy od prostego koła, aby zobaczyć wizerunek tej figury, należy podać punkt w którym znajduje się środek koła, promień oraz kolor.

Kolejnym wartym uwagi poleceniem jest plot, jak sama nazwa wskazuje służy do rysowania wykresów. Używając go należy pamiętać o podaniu funkcji ( może być w postacie zmiennej ) oraz parametru ( zakresu )

Kolejnym ciekawym aspektem są krzywe eliptyczne i ich wizualizacja. Aby zadeklarować taką funkcję należy podać parametry funkcji Weierstrassa i użyć polecenia EllipticCurve([par1, par2, par3, par4, par5])

7.       Wykresy trójwymiarowe

Podobnie jak w poprzednim podpunkcie jest to bardzo proste, tym razem używamy polecenia plot3d

8. Typy danych

– Liczby całkowite : ZZ

– Liczby rzeczywiste: RR

– Liczby wymierne: QQ

– Liczby zespolone: CC

Przykład ich zastosowania widzieliśmy już przy deklaracji macierzy podając typy wartości.

Ciekawą możliwością są działania w ciele, wykonujemy je za pomocą następującej składni F(wyrażenie)

9.       Wielomiany

W kryptologii współczesnej szczególną wagę przywiązujemy do wielomianów. Zobaczmy więc jak się nimi posługiwać.

10.       Krzywe eliptyczne

I na koniec wisienka na torcie, czyli krzywe eliptyczne. O których sensie przekonacie się już nie długo w kolejnych artykułach. Krzywą przedstawiamy za pomocą równania Weierstrassa, podając 5 zmiennych.

Możemy także dodawać punkty na krzywej, oraz obliczać np. wyznacznik który stwierdza gładkość równania

Obliczanie punktów izomorficznych na krzywej eliptycznej ( przykładowa implementacja )

    p = 7
    F = GF(p)
    lista = []
    forin F:
        for b in F:
            if ((4*a^3+27*b^2)!=0):
                lista.append((a,b))
    listapunktow = []
    while True:
        para=lista[0]
        forin range(1, p-1):
            newX = F(u^6*para[0])
            newY = F(u^4*para[1])
        if(((newX,newY) in lista)):
            lista.remove((newX,newY))
            listapunktow.append((newX,newY))
        if(len(lista)==0):
            break

    print listapunktow

Źródło: Dokumentacja SAGE Math, obrazy – opracowanie własne, grafika tytułowa: https://unsplash.com

Leave a Comment

Your email address will not be published. Required fields are marked with *

Cancel reply

Inne artykuły