1. Wstęp i Przegląd

W 21 stuleciu komutery dramatycznie zmieniają wszystkie aspekty naszego życia. Matematyka jest także wśród nich, i to zarówno sposób jej uprawiania jak i rodzaj problemów które nas interesują. Możliwość robienia obliczeń o wiele bardziej skomplikowanych niż to było wyobrażalne bez pomocy komputerów otworzyła dawniej nie osiągalne rejony badań dla każdego wyposażonego w komputer, odpowiednie oprogramowanie i trochę wiedzy matematycznej. Doprowadziło to do powstania potężnych programów dostosowanych do wszelkich aspektów matematyki obliczeniowej: symbolicznych manipulacji, obliczeń numerycznych i wizualizacji (włącznie z interaktywną). Jednym z czołowych programów tego typu jest Mathematica firmy Wolfram Research. Oczywiście Mathematica jest nie tylko doskonałym narzędziem do badania i studiowania nowych działów matematyki obliczeniowej ale także może być bardzo pomocna w tradycyjnych. Celem tego wstępnego rozdziału jest zademonstrowanie niektórych możliwości tego niezwykłego programu. Dla tego celu użyliśmy szereg przykładów, z których nie które są dziełem autorów tego tekstu, niektóre są zaporzyczone z oficjalnej dokumentacji Mathematiki a niektóre zebrany z różnych swobodnie dostępnych źródeł na internecie.

Podstawowe informacje o Mathematice

Główna stona na webie

Główna storna z aktualną informacją, pożytecznymi programami,  dodatkami, centrum edukacji
 i dokumentacją jest www.wolfram.com. Stąd można także pobrać darmowy CDF-Player,  tysiące  demonstracji z kodem źródłowym i  edukacyjne filmy.

Mathematica jest jednym z najpotężniejszych i najbardziej zaawansowanych systemów do symbolicznych i numerycznych obliczeń i wizualizacji. Ale jest także czymś więcej. W pierwszym okresie istnienia Mathematiki Wolfram Research opisywał ją jako “system do matematyki komputerowej” ale później zostało to zmienione na “jedyna platforma deweloperska w pełnie integurjąca obliczenia w całkowitych przepływach pracy” (“the only development platform fully integrating computation into complete work-flows”).  Innymi słowy, w wizji Wolfram Research Mathematica ma być uniwersalnym narzędziem programistycznym w którym wszelkiego rodzaju obliczenia (także symboliczne) są integralną cześcią systemu.

Na przykład, Mathematica jest bardzo zaawansowanym narzędziem do składu do druku, które  tworzy dokumenty matematyczne o jakości porównywalnej z LaTEX, ale równocześnie, te dokumenty mogą zawierać “żywe” formuły matematyczne i “żywą”  grafikę, w których zmiana peramterów czy innych danych powoduje automatyczne przelicznie i  regenerację wizualnego obiektu. Dokumenty zawierające żywe, interaktywne oblicznia mogę być wysłane do innej osoby: współpracownika, studenta lub profesora - nie koniecznie posiadająceo program Mathematica lub umiejętność jego obsługiwania,  który może zmienić parametry i wykonwyać własne obliczenia. W pewnym sensie jeszcze dalej idącym rozwinięciem tej idei jest działający na Webie program Wolfram|Alpha, którego “motorem” jest Mathematica.

Pod względem całości umiejętności  Mathematica nie ma dziś porównywalnego rywala. Jeśli jednak ograniczymy się tylko to obliczeń pewnego typu, np. algebry symbolicznej czy numeryki to istnieją inne programy (np. Maple, MatLab itd) o podobnych możliwościach. Jako program matematyczny, Mathematica jest programem dla celów ogólnych. Ma wysoko rozwinięte umiejętności robienia zarówno symbolicznych jak i numerycznych obliczeń. Ma bardzo dużo wyspecializowanych funkcji z różnych dziedzin matemayki (np. algebry wielomianowej, teorii grafów, różnań różniczkowych, teorii prawdopodobienstwa itp.), matematyki stosowanej (np. statystyki i matematyki finansowej) i innych dziedzin (np. cyfrowe przetwarzanie obrazów, cyfrowe przetwarzanie sygnałów itp.).  W niektórych dziedzinach (szeczególnie w matematyce “czystej”) istnieją programy “wyspecializowane” (np. MAGMA, Singular, Macauley2) które potrafią wykonywać niektóre oblicznia które w Mathematice nie są zaimplementowane i wymagają własnego programowania (co prawie zawsze oznacza że będą działać znacznie wolniej).

Oficjalnym dystrybutorem Mathematiki w polsce jest firma Gambit <http://www.mathematica.pl>.

Portal Wolfram Research i związane z nim projekty

Wolfram Research ma wiele stron internetowych związanych z Mathematiką i spokrewnionymi projektami.

Mathworld  <http://mathworld.wolfram.com/>

MathWorld jest bardzo pożytecznym i obszernym żródłem informacji z różnych dziedzin matematyki, zawierającym definicje, twierdzenia, przykłady itp. Czesto są one ilustrowane w załączonych plikach w formacie Mathematiki.

Wolfram Alpha  <http://www.wolframalpha.com/>

Wolfram Alpha - Mathematica (i więcej!) dla każdego!

Wolfram Demonstrations Project <http://demonstrations.wolfram.com>

Projekt zawiera ogromną ilość interaktywnych demonstracji z różnych dziedzin matematyki i nauki a także sztukę, gry itd. Każda demonstracją można pobrać w formie interaktywnego pliku CDF - który możne być w pełni używany przy pomocy darmowego CDF Playera (oczywiście nie potrzebnego osobą posiadającym najowszą wersję Mathematiki). Bardzo pożyteczną rzeczą jest dostępność kodu źródłowego każdej demonstracji. Może on być pobrany i swobodnie modyfikowny przez każdego kto ma dostęp do Mathematiki (CDF Player nie nadaje się do tego celu). Uważne studiowanie i modifikownie kodu demonstracji jest jedną z najlepszych metod nauczenia się programowania w Mathematice.

Program edukacyjny

Wolfram Research prowadzi ekstensywny program edukacyjny. Aby się zarejestować i uczestniczyć w online seminariach Wolfram Educational Group (WEG) należy wejść na stronę:
  <http://www.wolfram.com/services/education/calendar.cgi> 
Na świecie, w tym także w Polsce, jest wiele konferencji różnego typu poświęconych Mathematice i jej zastosowaniom.  Na Uniwersytecie Warszawskim ICM (centrum interdysciplinarne) prowadzi kursy w Mathematice.

The Mathematica Journal

The Mathematica Journal <http://www.mathematica-journal.com/> jest publikacją online poświęconą  zastosowaniom Mathematiki w pracy badawczej i dydaktycznej.

Inne strony związane z Mathematicą

Doskonałym i darmowym wstępem do programowania w Mathematica jest książka Leonida Shifrina:
http://www.mathprogramming-intro.org/

Także Mathematica Guidebooks <http://www.mathematicaguidebooks.org/index.shtml>  dostarczją bogatego zbioru przykładów spektaklarnych zastosowań Mathematiki, szczegulnie w fizyce ale nie tylko. Niestety,  “Guidebooks” nie są w pełni kompatibilne z wersjami Mathematiki  późniejszymi niż 5, więc nadają się najlepiej dla doświadczonych użytkowników programu którzy sami potrafią zrobić konieczne zmiany w programach.

Jednym z najlepszych sposobów zdobycia ekspertyzy w Mathematice jest udział w  grupie dysusyjnej group zwanej MathGroup: 

http://groups.google.com/group/comp.soft-sys.math.mathematica/topics?pli=1

Można tu zadawać pytania dotyczące każdego aspektu Mathematiki i otrzymać wiele, częste bardzo różnorodnych, odpowiedzi od ekspertów w Mathematice, włącznie z pracownikami Wolfram Research. Czasem można nawet dostać rozwiązanie zadania matematycznego, choć z regułu to forum nie powinno służyć temu celowi. 

Podobny cel ale w innym stylu jest realizowany przez stronę Mathematiki na Stack Exchange:
http://mathematica.stackexchange.com .
Podobnie jak inne strony Stack Exchange, nie jest to  “grupa dyskusyjna” jak MathGroup forum na którym zadaje się pytania i uzyskuje odpowiedzi. Użytkownicy zadają pytania i odpowiadają na pytnia innych  użytkowników, uzyskując za “punktystatusowe”,  “przywileje” i “odznaki” (badges). (Można także dostać punkty ujemne). 

Wielu expertów w Mathematice, włączie z pracownikami Wolfram Research, bierze udział także w tym forum. Główną przewagą tego forum nad MathGroup jest dużo bardziej nowoczesny interfejs - na przykład, można tu łatwo umieszczać grafikę i formuły matematyczne (MathGroup zezwala tylko na posty w formacie ASCII). Trzba pamiętać że tematyka Stack Exchange jest bardziej ograniczona i dotyczy prawie wyłącznie aspektów programistycznych.

Mathics

Dla tych którzy nie mają dostępu do Mathematici i dla których Wolfram|Alpha jest nie wystarczający (na przykład, dla osób które chcą programować) dobrą alternatywą jest
http://www.mathics.org
Mathics jest darmowym systemem do obliczeń i programowania używającym tego samego sytnaksu co Mathematica. Mathics zawiera tylko bardzo mały podzbiór funkcji matematycznych Mathematiki ale dobrze nadaje się do ćwiczenia  języka programaistycznego.  W pewnym sensie Mathics i Wolfram|Alpha uzupełniają się: Wolfram|Alpha ma dostęp do prawie wszystkich zaawansowanych funkcji matematycznych Mathematiki ale nie można w nim programować - w Mathics można programować używając tego samego języka co w Mathematice ale ilość wbudowanych funkcji jest ograniczona (niektóre bardziej zaawansowane opierają się na innym darmowym programie Sage).

Oczywiście naszym celem nie jest opisanie wsystkich zasobów wiedzy o i matriałów związanych z Mathematiką na Internecie. Byłoby to zadaniem nie możliwym do wykonania, nie tylko z powodu wielkiei ilości już istniejących stron i portali ale także dla tego że ich ilość ciągle się zwiększa. Tym niemniej mamy nadzieję że informacje zamieszczone powyżej stanowią dobrą podstawę dla każdego pragnącego uzykać podstawową wiedzę o Mathematica a także dla osób które już taką wiedzę posiadają ale chcą osiągnąc wyższy poziom umiejętności używania tego programu.

Wybrane przykłady możliwości Mathematiki.

Zastosowania obliczeniowe

Wbudowane funkcje

Wiele zadań (także wziętych “z życia”)  można rozwiązać po prostu używając jednej z ogromnej ilości “wbudowanych funkcji” w Mathematice (słowo “funkcja” jest użyte w tym kontekście w nieco innym znaczniu niż w matematyce).  Wśród najbardziej pożytecznych funkcji są Solve i Reduce. Są to bardzo ogólne funkcje używające ogromną ilość zaawansowanych algroytmów do  “rozwiązywania” i “redukowania” różnego typy równań i nierówności.  Należy tu od razu zauważyć że mówiąc o “rozwiązywaniu” mamy na myśli poszukiwanie dokładnych  rozwiązań a nie rozwiązań przybliżonych. W tym sensie rozwiązaniami równania (x^2)==2 są (Sqrt[2]) i -(Sqrt[2])

Solve[(x^2)==2,x]

a nie ich wartości przybliżone. Mathematica, oczywiście,  zawiera także funkcje służące do rowiązywania równań metodami numerycznymi, np.

NSolve[(x^2)==2,x]

FindRoot[x^2==2,{x,1}]

ale na razie nie będziemy się nimi zajmowali. Należy jednak rozumieć że to że Solve i Reduce dają “dokładne” rozwiązania nie oznacza że używają one wyłącznie metod symbolicznych. Jednym z najbardziej interesujących zjawisk w nowoczesnej “algeberze komputerowej” jest integracja obliczeń symbolicznych i numerycznych  która doprowadziła do powstania tak zwanych metod symboliczno-numerycznych (symbolic-numeric computation). Tradycyjnie metody symboliczne prowadziły do wyników dokładnych ale kosztem czasochłonności i pamięcio-chłonności obliczeń natomiast dużo szybsze metody numeryczne dawały przybliżone rozwiązania problemów. Metodody numeryczno-syboliczne są szybsze i wymagają mniej pamięci od metod czysto symbolicznych ale dają wyniki dokładne (w sensie który będzie opisany ponizej). Metody symboliczno-numeryczne odgrywają kluczową rolę w niektórych najciekawszych i najbardziej zaskakujących umiejętnościach funkcji Reduce i Solve.

W wersjach Mathematiki wcześniejszych niż 8 funkcje Reduce i Solve różniły się zarówno formatem wyników jak i  rodzajem problemów do których mogły być stosowane. We wczesnych wersjach Mathematiki Solve rozwiązwyała w zasadzie tylko równania algebraiczne (wielomianowe), natomiast Reduce “redukowała”  równania i nierówności każdego typu dla którego Mathematica potrafiła znaleźć rozwiązanie dokładne i pełne. W wersji 8 różnice między tymi funkcjami są znacznie mniejsze bo Solve używa wiele z metod które dawniej używane były tylko przez Reduce.  W dalszej części tego przeglądu będziemy używali głównie Reduce, zauważmy jednak jedną przewagę jaką Solve ma w niektórych sytuacjach. “Przwaga” ta wynka z tego że Reduce stara się dać pełne rozwiązanie problemu, gdy tymczasem Solve może dawać rozwązania częściowe. Dla ilustracji rozważmy skomplikowane równanie nie algebraiczne:

eq=(x-1) ((E^x)-sin((x^2)))==0;

Widzimy że jeden pierwiastek (x==1) można znaleźć bardzo łatwo i rzeczywiście Solve nie ma z nim problemu:

Solve[eq,x]

Funkcja Solve znalazła ten oczywisty pierwiastek i poinfomrowała nas że rozwiązanie nie jest zupełne sugerując użycie Reduce w celu jego znalezienia. Sugestia niestety nie działa:

Reduce[eq,x]

Reduce poinformawała nas że to równanie nie da się rozwiązać metodami używanymi przez Reduce. Nie ma w tym nic dziwnego bo równanie ma nieskończenie wiele pierwiastków. Jeśli jednak ograniczymy się tylko do skończonego przedziału liczb rzeczywistych to Reduce znajdzie wszystkie pierwiastki,np.

Reduce[eq&&-5≤x≤5,x]

Nie będziemy teraz próbowali tłumaczyć dokładnie co to znaczy, ale zauważmy że:
1. Reduce znalazła 9 pierwiastków leżacych pomiędzy -5 i 5. 
2. Jest to pełne rozwiązanie problemu, to znaczy można to traktować jako dowód że jest dokładne 5 takich pierwiastków. 
3. Odpowiedź jest podana w formie sumy logicznej równań elementarnych (a nie listy reguł jak w przypadku Solve) - a więc równanie zostało zredukowane - zgodnie z nazwą funkcji.

Przejdźmy teraz do rzeczy bardziej podstawowych - równań wielomianowych. Zacznijmy od równania  trzeciego stopnia, które Mathematica potrafi rozwiązać przy pomocy sławnej formuły   del Ferro z szestnastego wieku (czesto nazywanej formułą Tartaglii):

Reduce[x^3-x+1==0,x,Cubics->True]

Możemy także otrzymać tylko pierwiastek rzeczywisty:

Reduce[x^3-x+1==0,x,Reals,Cubics->True]

Oczywiście możemy obliczyć jego wartość z dowolną precyzją, na przykład do 30 miejsc dziesiętnych:

N[%,30]

Ze sławnych twierdzeń Abela i Galois wiadomo że rowiązań tego typu (wyrażonych za pomocą  pierwiastników) nie można podać dla ogólnych równań stopnią 5 i wyżej. Oczywiście Mathematica potrafi rozwiązać takie równania dokładnie:

Reduce[x^5-x+1==0,x]

Każdy z pierwiastków opisany jest przez dwa parametry: jego wielomian minimalny (wielomian najmnieszego stopnia o całkowitych współczynnikach którego pierwiastkiem jest dany pierwiastek) oraz liczba naturalna pomiędzy 1 i stopniem wielomianu, która odpowiada pewnemu uporządkowaniu pierwiastków. To uporządkowanie jest  nietrywialnym rezultatem algorytmu zwanego “izolacją pierwiastków”. Po izolacji pierwiastków możemy obliczyć je do dowolnej precyzji:

N[Root[1-#1+((#1)^5)&,1],50]

Reduce można używać do rozwiązywania problemów całkowicie symbolicznych. Na przykład, możemy łatwo uzyskać znany warunek na to żeby równanie kwadratowe a (x^2)+b x+c==0 miało dwa równe pierwiastki:

Reduce[(Subscript[∃, x,a (x^2)+b x+c==0])(Subscript[∀, y,a (y^2)+b y+c==0])x==y,{a,b,c}]

To oczywiście każdy zna z algebry szkolnej ale już dla równania 3 stopnia uzyskanie podobnego wyniku nie jest takie łatwe:

Reduce[Exists[{x,y}, x^3 +a (x^2)+b*x + c == 0&&y^3+a (y^2) + b*y + c == 0,ForAll[z, z^3 +a (z^2) + b*z + c == 0, z == x||z==y]], {b, c}]

Spróbujmy teraz równanie trygonometryczne. Na początek na skończonym przedziale, gdzie ma skończenie wiele pierwiastków:

Reduce[Cos[x]==Sin[x]&&0<x<2Pi,x]//FullSimplify

(FullSimplify służy do upraszczania odpowiedzi. Proszę sprawdzić co się stanie jeśli nie użyjemy tej funkcji).

Następnie rozwiążmy (lub rzaczej zredukujmy) to równanie na całej osi rzeczywistej:

Reduce[Cos[x]==Sin[x],x]//FullSimplify

Spróbujmy teraz coś dużo trudniejszego: równanie którego, mogłoby się wydawać, rozwiązać nie sposób. Ograniczymy się do rozwiązań leżących wewnątrz okręgu o promieniu 1 z centrum w 0.

Reduce[Cos[Cos[x]]==Sin[Sin[x]]&&Abs[x]<1,x]

Wygląda to jak rozwiązanie przybliżone ale w rzeczywistości jest ono “dokładne”. Można je obliczyć z dowolną precyzją:

N[%,20]

Możemy także udowodnić że nasze równanie nie ma rozwiązań rzeczywistych:

Reduce[Cos[Cos[x]]==Sin[Sin[x]],x,Reals]

Reduce potrafi rozwiązać wiele równań i i nierówności różnego typu. Na przykład to jest równanie w dziedzinie liczb całkowitych:

Reduce[n!+n==726&&n>0,n,Integers]

Następne przykłady są wzięte z pytań wysłanych do internetowego forum MathGroup. Pierwsze było wysłane w styczniu 2011 przez Iwana Smirnowa:

Czy isnieją nietrywialne rozwiązania równania diofantycznego

(x^10)+(y^10)+(z^10)=(t^2)

gdzie, jak zawsze w równaniach diofantyjskich, rozwiązania powinny być liczbami całkowitymi.  Odpowiedź nie jest znana i Mathematica nie potrafi tego problemu rozwiązań ale bardzo łatwo można udowodnić że nie ma rozwiązań dla t≤(10^4):

Reduce[x^10+y^10+z^10==t^2&&0≤x&&0<y&&x≤y&&y≤z&&1≤t≤10^4,{x,y,z,t},Integers]//Timing

(Funkcja Timing podaje czas zająty przez oblicznie i jest oczywiście zależny od szybkości danego komputera). Zmieniając niektóre domyślne parametry Mathematiki, można łatwo udowodnić że nie ma rozwiązań nietrywialnych dla 0≤ t ≤ (10^10).

Programowanie

Dotąd rozważaliśmy problemy które dają się rozwiązać przez zastosowanie jedej wbudowanej funkcji Mathematiki (Reduce). Wiele problemów które pojawiają się “w życiu” oczywiście nie są tego typu. W takich sytuacjach musimy sami napisać odpowiedni program (albo kogoś poprosić żeby to dla nas zrobił). Następny przykład znowu pochodzi z MathGroup:

Znajdź wszytkie trójki różnych dwu cyfrowych liczb pierwszych takie że 
i) średnia każdej z dwóch liczb w trójce  jest liczbą pierwszą
ii) średnia wszystkich trzech liczb w trójce jest liczbą pierwszą
 W Mathematice kod rozwiązujący ten problem można napisać na wiele sposobów. Na przykład:

ls1=Select[Range[11,99],PrimeQ];
ls2=Tuples[ls1,{3}];
ls3=DeleteCases[DeleteDuplicates[Sort/@ls2],{___,x_,___,x_,___}];
Select[ls3,And@@PrimeQ/@Mean/@Partition[#1,2,1,{1,1}]&]

Dokładne wytłumacznie tego kodu wymagałoby więcej wiedzy o programowaniu w Mathematice niż możemy założyć w tym momencie ale chcielbyśmy zwrócić uwagę na użycie całego szeregu wbudowanych funkcji, które w tradycyjnych językach programistycznych wymagałyby osobnego programowania. Na przykład, w pierwszej linijce wybieramy z listy liczb pomiędzy 11 i 99 wszystkie liczby pierwsze, przy pomocy wbudowanych funkcji Select i PrimeQ. W drugiej linijce tworzymy  listę wszyskich trójek liczb pierwszych. W trzeciej linijce usuwamy wszyskie “powtórki” (przy pomocy takich funkcji jak Sort, DeleteDuplicates i DeleteCases i na koniec z trójek które nam pozostały wybieramy te które spełniają warunki zadania. 
Oczywiśce nazwy ls1, ls2 ... i operacje przypisywania są całkowicie zbyteczne ale dla wielu osób kod napisany w ten sposób jest bardziej czytelny. Można go, oczywiście, przepisać w formie:

Select[DeleteCases[DeleteDuplicates[Sort/@Tuples[Select[Range[11,99],PrimeQ],{3}]],{___,x_,___,x_,___}],And@@PrimeQ/@Mean/@Partition[#1,2,1,{1,1}]&]

Jest to tak zwany  “jednoliniowiec”. Jednoliniowce mają swoich wielbicieli i jest nawet coroczny konkurs na najbardziej intrygującego jednoliniowca. 
(Notowniki z konkursu z roku 2012 można znaleźć tu:  https://www.wolfram.com/training/special-event/mathematica-experts-live-one-liner-competition-2012/ ) Dla zwykłych śmiertelników prawdopodobnie wesja kodu z nazwami i przypisywaniem jest prawdopodobnie łatwiejsza do odczytania. 

Weśmy jeszcze jeden przykład zadania z MathGroup:

Jaki jest najłatwiejszy sposób znalezienia długości powtarzającego się cykla w dziesiątkowym rozwinięciu ułamka? Na przykład 1/7 = 0,14285714285714285714 a więc dlugość cykla (142857) jest 6.

Jak zwykle w Mathematice podstawą wydajnego programowania jest dobra znajomość wbudowanych funkcji a także pewna znajomość matematyki. W tym przypadku nie ma wbodowanej funkcji która bezpośrednio dawałaby odpowiedź na nasz problem ale są dwie blisko z nim związane funkcje: IntegerExponent i MultiplicativeOrder. Za ich pomocą możemy zdefiniować funkcję która będzie obliczała długość cykla:

lengthOfCycle[x_Rational]:=Module[{n=Denominator[x],a,b},a=IntegerExponent[n,2];
b=IntegerExponent[n,5];MultiplicativeOrder[10,n/(2^a*5^b)]]

Teraz widzimy że:

lengthOfCycle[1/7]

daje poprawną odpowiedź.

Jedną z przyczyn dla których dobra znajomość wbudowanych funkcji jest tak bardzo ważna w programowaniu w Mathematice jest fakt że takie funkcje działają dużo szybciej niż równoważne funkcje napisane przez użytkowników - równie szybko lub nawet szybciej niż podobne funkcje napisane w kompilowanych językach takich jak C. Tym niemniej “zwykłe” programy napisane w Mathematice także często mogą być dużo przyśpieszone poprzez tak zwaną kompilację. Podamy teraz przykład programu który bez kompilacji działa dosyć wolno ale kompilacja powoduje jego dramatyczne przyspieszenie. Program konstruuje spiralę Ulama <http://mathworld.wolfram.com/PrimeSpiral.html> i autorstwa Daniela Lichtblau z Wolfram Reseach

ulamSpiral=Compile[{{len,_Integer}},Module[{dat=Range[len],x=0,y=0,shift=1,i=0,j=0,xincr={1,0,-1,0},yincr={0,1,0,-1},shiftincr={0,1,0,1}},Select[Table[i++;
If[i≥shift,i=1;shift+=shiftincr[[Mod[j,4,1]]];j++;];
x+=xincr[[Mod[j,4,1]]];y+=yincr[[Mod[j,4,1]]];
If[PrimeQ[dat[[num]]],{x,y},{1000,1000}],{num,len}],Abs[First[#]]<1000&]],{{PrimeQ[_],True|False}}];

Stworzenie spirali z 60,000 punktów zajmuje tylko ułamek sekundy:

ul=ulamSpiral[60000];//Timing

Możemy przedstawić spiralę jako zbiór punktów, używając funkcji ListPlot:

ListPlot[ul]

lub jako zbiór linii

ListLinePlot[ul]

W Mathematice 8 i 9 ten kod może być jeszcze przyspieszony przez zastosownie opcji CompilationTarget->"C" funkcji Compile, ale będzie to skuteczne tylko jeśli na komputerze jest zainstalowany odpowiedni kompilator języka “C”.

Wyspecializowane funkcje matematyczne - przykłady ze statystyki i matematyki finansowej

Poza funkcjami ogólno matematycznymi, takimi jak Reduce, Mathematica ma także wiele funkcji służących specyficznym działom matematyki, czystej i stosowanej. Niektóre z nich znajdują się w osobnych pakietach, które trzeba wczytać do Mathematiki przed użyciem. Na przykład, Mathematica nie ma obecnie wbudowanej funkcji do Analizy Wariancji (ANOVA) ale jest ona w osobnym pakiecie Anova. Zauważmy że normalnie w Mathematica nie ma takiej funkcji:

?ANOVA

Wczytamy teraz pakiet ANOVA

Needs["ANOVA`"]

Należy zwrócić uwagę na to że ostatni symbol przez końcem cudzysłowa to grawis: `  . 
Po wczytaniu pakietu będzie działać funkcja ANOVA:

?ANOVA

Funkcja zawarte w pakietach nie różnią się niczym od funkcji napisanych przez użytkowników (faktycznie każdy może tworzyć własne pakiety i wczytywać je albo automatycznie albo kiedy zajdzie taka potrzeba). Funkcje takie są więc powolniejsze od funkcji wbodowanych. W wielu przypadkach funkcje zawarte w pakietach automatycznie dołączonych do Mathematiki , (MouseOver)
po dalszej optymalizacji pojawią się jako funkcje wbudowane w przyszłych wersjach Mathematiki. 

Jedną z bardziej interesujących funkcji wbudowanych nie będącą funkcja matematyczną jest funkcja FinancialData, która pobiera bezpośredno dane z giełd amerykańskich (funkcja ta nie będzie działać bez połączenia z Internetem). Weźmy dla przykładu listę cen akcji firmy Apple od 1 Stycznia 2007 roku:

data= FinancialData["AAPL", "Jan. 1, 2007"];

Teraz możemy zrobić wykres tych danych za pomocą wbudawanej funkcji DateListPlot:

DateListPlot[data, Joined -> True,PlotLabel->"Apple"]

Zamiast samych cen często bada się zwroty (logarytmiczne). Można je oczywiście obliczyć używając danych cen, ale można także pobrać przy pomocy FinancialData. Tym razem weźmiemy dane dla indeksu Standard & Poor 500:

returns= FinancialData["^GSPC","Return", "Jan. 1, 2007"];

Pryjrzyjmy się kilku pierwszym wyrazom “returns”:

Take[returns,3]

Widzimy że returns jest listą par o formie: {data, zwrot}. Dla dalszej analizy użyjemy tylko wartości zwrotów:

zwroty=returns[[All,2]];

Użyjemy teraz wbudowanej funkcji SmoothKernelDistribution do estymacji  rozkladu zwrotów:

f=SmoothKernelDistribution[zwroty];

Plot[PDF[f][x],{x,-0.03,0.03},PlotRange->All]

Jaki rozkład statystyczny najlpiej opisuje zachowanie się indeksu? Wypróbujmy najpierw rozkład normalny, który dominował w modelowaniu tego typu przed kryzysem finansowym 2008 roku. W Mathematice takie obliczenia robi się bardzo łatwo:

r1=EstimatedDistribution[zwroty,NormalDistribution[μ,σ]]

Zobaczmy jak dobrze pasuje ten rozkład normalny do danych empirycznych:

Plot[{PDF[f][x],PDF[r1][x]},{x,-0.03,0.03},PlotRange->All]

Spróbujmy innego rozkładu. Wiadomo że zwroty indeksu S&P 500 są dobrze opisywane przez rozkład Meixnera (który odpowiada modelowi cen akcji opartym na pewnym procesie skokowym zwanym procesem Meixnera). Wypróbujmy tą hipotezę.

r2=EstimatedDistribution[zwroty,MeixnerDistribution[a,b,m,d]]

Plot[{PDF[f][x],PDF[r2][x]},{x,-0.03,0.03},PlotRange->All]

Widać wyraźnie że rozkład Meixnera dużo lepiej modeluje zwroty S&P 500 niż rozkład normalny.

Grafika i interaktywna “Dynamika”.

Mathematica nie była pierwszym programem do “matematyki komputerowej” (zwanej także algebrą komputerową) ale kiedy pojawiła się w roku 1988 odróżniała się od innych programów tego typu dużo lepszymi umiejętnościami graficznymi, szczególnie w grafice 3 wymiarowej. 25 lat później Mathematica nadal wybija się pod względem tradycyjnej grafiki ale od wersji 6 posiada także inne umiejętności jeszcze lepiej pasujące do “ducha 21 wieku”, mianowicie: umiejętność (łatwego) tworzenia interaktywnych programów  wykonujących obliczenia w których można zmieniać parametry za pomocą elementów interfejsu: menu, suwaków, przycisków itp. Programy dynamiczne nie muszą zawierać grafiki, ale najczęściej używane są do tworzenia “interaktywnych animacji graficznych”, różniących się od tradycyjnych animacji (w których  oczywiście Mathematica jest także bardzo sprawna) większą kontrolą użytkownika. Cała ta funkcjonalność jest oparta na funkcji  Dynamic:

?Dynamic

Do większości celów wystarczy prostsza funkcja Manipulate (która sama jest skonstruowana za pomocą Dynamic). Obie funkcję będą rozważone szczegółowo w osobnym rozdziale.

Format CDF , CDF Player  i Projojekt Demonstracji Wolframa.

Wraz z wersją 8 Mathematiki pojawił się nowy format plików Mathematici: CDF czyli Computable Document Format. Nie przypadkowo nazwa przypomina PDF (Portable Document Format). Podobnie jak w przypadku PDF, pliki CDF można “czytać” używając programu darmowego (CDF Player, który odgrywa podobną rolę do Adobe Readera) ale aby je tworzyć potrzebna jest jedna z kilku istniejących komercyjnych wersji Mathematiki. Zasadniczą różnicą między CDF Playerem i Adobe Readerem jest o ile ten drugi w zasadzie jest przeznaczony do posługiwania się statycznymi dokumentami, to ten pierwszy potrafi  wykonać wszystko co potrafi wykonać Mathematica, czyli  obliczenia symboliczne i numeryczne, interaktywną grafikę i dźwięk, itp. Jedyną rzecz której CDF Player robić nie potrafi to niezależne programowanie. Innymi słowy, użytkownik CDF Playera ma dostęp tylko do takich funkcji jakie wykorzystał w danym pliku CDF jego oryginalny twórca i może zmieniać ich argumenty i parametry tylko poprzez interfejs stworzony przez twórcę pliku.

Wolfram CDF Player

CDF Player pozwala na proste używanie wszystkich zasobów Mathematiki  przez osoby nie znające jej języka programistycznego i nawet nie posiadające Mathematiki. Jest on szczególnie pożyteczny w połączeniu z Projektem Demonstracji Wolframa: http://demonstrations.wolfram.com
Na tej stronie można znaleźć tysiące interaktywnych programów ilustrujących twierdzenia, dowody, eksperymenty itp. z różnych dziedzin matematyki, nauk przyrodniczych i społecznych, a także sztukę, gry itp. Wszytkie pliki są w formacie CDF a więc może je w pełni używać przy pomocy tylko CDF Playera. Projekt  zawiera także kod źródłowy wszystkich demonstracji, który można pobrać i swobodnie modyfikować. Dla osób mających dostęp do Mathematiki jest to doskonała metoda nauczenia się zaawansowanych technik programowania.

Wolfram Alpha i “swobodna forma”.

Wolfram Alpha - Mathematica dla każdego!

Pojawienie się Wolfram | Alpha uzyskało dużo uwagi medialnej  ale stosunkowo mało osób  zdaje sobie sprawę że Wolfram Alpha jest oparty na Mathematice i, w rezultacie, dostarcza szerokiej publiczności możliwiść darmowego dostępu do dużej części funkcjonalności Mathematiki. Co więcej, ten sposób używania Mathematici  nie wymaga nauczenia się syntaksu języka and nawet znajomości istniejących funkcji i ich nazw. Najsławniejszy aspekt Wolfram | Alpha to możliwość używania “swobodnej formy” języka, włącznie z formułami matematycznymi. Zasada jest prosta: wpisz swoje pytanie używając normalnego angielskiego (planowana jest możliwość używania innych języków w przyszłości) i Wolfram | Alpha spróbuje zgadnąć o co chodzi i dostarczyć odpowiedzi przy pomocy Mathematici (i nie tylko). “Odpowiedzi” dawane przez Wolfram | Alpha są dużo bardziej obszerne niż te które daje sama Mathematica, co oczywiście jest sensowne, jeśli weźmiemy pod uwagę to że “swobodna forma” Wolfram |Alpha jest o wiele mniej precyzyjna od form wejsciowych Mathematiki. 
Zobaczmy to na przykładzie obliczania funkcji pierwotnej (całki nieokreślonej)  ∫x log(x)dx. Zaczniemy od “normalnej” Mathematiki.

Integrate[x Log[x],x]

Teraz użyjemy Wolfram | Alpha. Większość osób, oczywiście robi to przy pomocy przeglądarki wchodząć na stronę http://www.wolframalpha.com ale użytkownicy Mathematici  mogą robić dokładnie to samo bezpośrednio z Mathematiki (oczywiście potrzebne jest połączenie z Internetem), za pomocą funkcji WolframAlpha:

WolframAlpha["indefinite integral of xlog(x)"]

Widzimy że otrzymaliśmy dużo więcej informacji niż to o co nam chodziło. Intersującym i pożytecznym faktem jest to że  Wolfram | Alpha “rozumie” także normalny syntaks Mathematiki  i ewaluując WolframAlpha["Integrate[x Log[x],x]"] uzyskamy dokładnie ten sam wynik jak powyżej.

Na koniec, warto zauważyć że sama Mathematica także potrafi używać “swobdnej formy” formuł wejściowych. Aby użyć tej funcyjności zaczynamy formułe od  = , poczym piszemy “swobodnie”, np.

Jak widzimy, Mathematica skutecznie rozpoznała o co nam chodziło i podała dokładne rozwiązanie bez zbytecznych dodatkowych informacji.