RAPORT Z BADAŃ WŁASNYCH OPRACOWANIE BIBLIOTEKI DOKŁADNYCH OBLICZEŃ NUMERYCZNYCH W JĘZYKU PYTHON

Podobne dokumenty
Dokªadna arytmetyka liczb rzeczywistych w j zyku Python

REPREZENTACJA LICZBY, BŁĘDY, ALGORYTMY W OBLICZENIACH

Aproksymacja diofantyczna

REPREZENTACJA LICZBY, BŁĘDY, ALGORYTMY W OBLICZENIACH

Liczby zmiennoprzecinkowe i błędy

Aproksymacja funkcji a regresja symboliczna

UKŁADY ALGEBRAICZNYCH RÓWNAŃ LINIOWYCH

Metody numeryczne Technika obliczeniowa i symulacyjna Sem. 2, EiT, 2014/2015

6. Liczby wymierne i niewymierne. Niewymierność pierwiastków i logarytmów (c.d.).

Kształcenie w zakresie podstawowym. Klasa 1

5. Logarytmy: definicja oraz podstawowe własności algebraiczne.

Próbny egzamin z matematyki dla uczniów klas II LO i III Technikum. w roku szkolnym 2012/2013

Podstawy analizy matematycznej II

Zagadnienia do małej matury z matematyki klasa II Poziom podstawowy i rozszerzony

LISTA 5. C++ PETLE for, while, do while

O liczbach niewymiernych

Jarosław Wróblewski Matematyka Elementarna, lato 2012/13. Czwartek 28 marca zaczynamy od omówienia zadań z kolokwium nr 1.

Równania nieliniowe. LABORKA Piotr Ciskowski

1. Znajdowanie miejsca zerowego funkcji metodą bisekcji.

Plan wynikowy z wymaganiami edukacyjnymi z matematyki w zakresie podstawowym dla klasy 1 zsz Katarzyna Szczygieł

Funkcje: wielomianowa, wykładnicza, logarytmiczna wykład 2

Program zajęć pozalekcyjnych z matematyki poziom rozszerzony- realizowanych w ramach projektu Przez naukę i praktykę na Politechnikę

Ciągi liczbowe wykład 3

Met Me ody numer yczne Wykład ykład Dr inż. Mic hał ha Łan Łan zon Instyt Ins ut Elektr Elektr echn iki echn i Elektrot Elektr echn olo echn

Zajęcia nr 1 (1h) Dwumian Newtona. Indukcja. Zajęcia nr 2 i 3 (4h) Trygonometria

Wielkości liczbowe. Wykład z Podstaw Informatyki dla I roku BO. Piotr Mika

1 Wyrażenia potęgowe i logarytmiczne.

a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]

Laboratorium 5 Przybliżone metody rozwiązywania równań nieliniowych

ROZKŁAD MATERIAŁU NAUCZANIA KLASA 1, ZAKRES PODSTAWOWY

BŁĘDY OBLICZEŃ NUMERYCZNYCH

Wielkości liczbowe. Wykład z Podstaw Informatyki. Piotr Mika

w analizie wyników badań eksperymentalnych, w problemach modelowania zjawisk fizycznych, w analizie obserwacji statystycznych.

Arytmetyka. Działania na liczbach, potęga, pierwiastek, logarytm

ROZKŁAD MATERIAŁU DO II KLASY LICEUM (ZAKRES ROZSZERZONY) A WYMAGANIA PODSTAWY PROGRAMOWEJ.

Jarosław Wróblewski Matematyka Elementarna, zima 2012/13

Całki nieoznaczone. 1 Własności. 2 Wzory podstawowe. Adam Gregosiewicz 27 maja a) Jeżeli F (x) = f(x), to f(x)dx = F (x) + C,

Systemy liczbowe. 1. Przedstawić w postaci sumy wag poszczególnych cyfr liczbę rzeczywistą R = (10).

PORÓWNANIE TREŚCI ZAWARTYCH W OBOWIĄZUJĄCYCH STANDARDACH EGZAMINACYJNYCH Z TREŚCIAMI NOWEJ PODSTAWY PROGRAMOWEJ

SPIS TREŚCI WSTĘP LICZBY RZECZYWISTE 2. WYRAŻENIA ALGEBRAICZNE 3. RÓWNANIA I NIERÓWNOŚCI

Wstęp do Programowania potok funkcyjny

Kup książkę Poleć książkę Oceń książkę. Księgarnia internetowa Lubię to!» Nasza społeczność

Wymagania na egzamin poprawkowy z matematyki z zakresu klasy pierwszej TECHNIKUM

2) R stosuje w obliczeniach wzór na logarytm potęgi oraz wzór na zamianę podstawy logarytmu.

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Zasady arytmetyki stałoprzecinkowej oraz operacji arytmetycznych w formatach Q

PRZEDMIOTOWY SYSTEM OCENIANIA PROSTO DO MATURY KLASA 1 ZAKRES PODSTAWOWY

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Powtórzenie podstawowych zagadnień. związanych ze sprawnością rachunkową *

Funkcje: wielomianowa, wykładnicza, logarytmiczna wykład 3

Technologie Informacyjne Wykład 4

Jarosław Wróblewski Matematyka Elementarna, zima 2013/14. Czwartek 21 listopada zaczynamy od omówienia zadań z kolokwium nr 2.

ARYTMETYKA BINARNA. Dziesiątkowy system pozycyjny nie jest jedynym sposobem kodowania liczb z jakim mamy na co dzień do czynienia.

Klasa 1 technikum. Poniżej przedstawiony został podział wymagań na poszczególne oceny szkolne:

W planie dydaktycznym założono 172 godziny w ciągu roku. Treści podstawy programowej. Propozycje środków dydaktycznych. Temat (rozumiany jako lekcja)

V. WYMAGANIA EGZAMINACYJNE

PROPOZYCJA PLANU WYNIKOWEGOREALIZACJI PROGRAMU NAUCZANIA Matematyka przyjemna i pożyteczna W DRUGIEJ KLASIE SZKOŁY PONADGIMNAZJALNEJ

EGZAMIN W KLASIE TRZECIEJ GIMNAZJUM W ROKU SZKOLNYM 2017/2018 CZĘŚĆ 2. ZASADY OCENIANIA ROZWIĄZAŃ ZADAŃ

Podstawy Informatyki

Metody numeryczne. Janusz Szwabiński. nm_slides.tex Metody numeryczne Janusz Szwabiński 2/10/ :02 p.

1 Funkcje elementarne

Ciągi liczbowe. Zbigniew Koza. Wydział Fizyki i Astronomii

Podstawy i języki programowania

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

UKŁADY ALGEBRAICZNYCH RÓWNAŃ LINIOWYCH

Standardy wymagań maturalnych z matematyki - matura

Część całkowita i ułamkowa, funkcje trygonometryczne, podstawowe własności funkcji

Wymagania edukacyjne z matematyki na poszczególne śródroczne oceny klasyfikacyjne dla klasy VII w roku 2019/2020.

Wymagania edukacyjne na poszczególne oceny branżowa szkoła I stopnia klasa 1 po gimnazjum

Obliczenia iteracyjne

1 Funkcja wykładnicza i logarytm

Metody numeryczne I Równania nieliniowe

Interpolacja. Marcin Orchel. Drugi przypadek szczególny to interpolacja trygonometryczna

Wymagania kl. 3. Zakres podstawowy i rozszerzony

III. Funkcje rzeczywiste

Algorytm. a programowanie -

KLUCZ PUNKTOWANIA ODPOWIEDZI

2. ZASTOSOWANIA POCHODNYCH. (a) f(x) = ln 3 x ln x, (b) f(x) = e2x x 2 2.

Wymagania edukacyjne. Hasło z podstawy programowej 1. Liczby naturalne 1 Liczby naturalne, cechy podzielności. Liczba godzin

Liczby rzeczywiste. Działania w zbiorze liczb rzeczywistych. Robert Malenkowski 1

4. Postęp arytmetyczny i geometryczny. Wartość bezwzględna, potęgowanie i pierwiastkowanie liczb rzeczywistych.

Wymagania edukacyjne: Matematyka Zasadnicza Szkoła Zawodowa

1 Funkcja wykładnicza i logarytm

Wymagania edukacyjne na poszczególne oceny To się liczy! Branżowa Szkoła I stopnia, klasa 1 po szkole podstawowej

Metody numeryczne I. Janusz Szwabiński. Metody numeryczne I (C) 2004 Janusz Szwabiński p.1/61

Wymagania edukacyjne niezbędne do uzyskania śródrocznych i rocznych ocen klasyfikacyjnych. z matematyki dla uczniów klasy I LO poziom podstawowy

WYMAGANIA EDUKACYJNE Z MATEMATYKI DLA KLASY III

Metody rozwiązywania równań nieliniowych

Algorytmy i struktury danych

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 5. Karol Tarnowski A-1 p.

METODY ROZWIĄZYWANIA RÓWNAŃ NIELINIOWYCH

1 Metody rozwiązywania równań nieliniowych. Postawienie problemu

Wymagania edukacyjne z matematyki dla zasadniczej szkoły zawodowej na poszczególne oceny

III. STRUKTURA I FORMA EGZAMINU

WYMAGANIA I KRYTERIA OCENIANIA Z MATEMATYKI W 3 LETNIM LICEUM OGÓLNOKSZTAŁCĄCYM

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

Technikum Nr 2 im. gen. Mieczysława Smorawińskiego w Zespole Szkół Ekonomicznych w Kaliszu

Metody Numeryczne w Budowie Samolotów/Śmigłowców Wykład I

Egzamin z Metod Numerycznych ZSI, Grupa: A

Wymagania edukacyjne z matematyki dla klasy pierwszej zasadniczej szkoły zawodowej

Transkrypt:

RAPORT Z BADAŃ WŁASNYCH OPRACOWANIE BIBLIOTEKI DOKŁADNYCH OBLICZEŃ NUMERYCZNYCH W JĘZYKU PYTHON MARCIN CIURA Streszczenie. W ramach badań opracowano bibliotekę procedur w języku Python, która realizuje podstawowe operacje arytmetyczne i funkcje matematyczne. Dzięki zastosowaniu leniwie wartościowanych ułamków łańcuchowych wyniki działań można podawać z dowolną dokładnością. Autor zaimplementował znane z literatury algorytmy wykonywania czterech działań arytmetycznych na ułamkach łańcuchowych oraz opracował nowe algorytmy obliczania wartości funkcji wykładniczej, logarytmów oraz funkcji trygonometrycznych i cyklometrycznych ułamków łańcuchowych.. Wprowadzenie W języku programowania Python dostępny jest standardowy zmiennoprzecinkowy typ danych float i biblioteka funkcji matematycznych math. Ponadto od wersji.4 języka wprowadzono doń bibliotekę stałoprzecinkową decimal operującą na liczbach dziesiętnych []. Do profesjonalnych obliczeń numerycznych można używać dodatkowej biblioteki gmpy, stanowiącej interfejs do biblioteki obliczeń wielokrotnej precyzji GNU Multiple Precision (GMP) []. Wspólną cechą tych bibliotek jest to, że wykonywane za ich pomocą obliczenia, choć szybkie, są obarczone błędami zaokrągleń. Cała dziedzina nauki analiza numeryczna powstała, by szacować wielkość tych błędów, nawarstwiających się przy stosowaniu algorytmów numerycznych. Idea niniejszej pracy jest odmienna: biblioteka będąca jej przedmiotem służy dokładnym obliczeniom. Przy jej stosowaniu nie występują błędy zaokrągleń. W literaturze przedmiotu opisano wiele podejść do dokładnej arytmetyki liczb rzeczywistych, z zastosowaniem ułamków łańcuchowych [3, 4], skalowanych liczb całkowitych [5, 6], przekształceń Möbiusa [7], i innych sposobów, które nie doczekały się praktycznych implementacji, jak układy pozycyjne o niecałkowitej lub ujemnej podstawie, zagnieżdżone ciągi przedziałów o końcach wymiernych, czy ciągi Cauchy ego [8]. Niniejsza praca przedstawia użycie do dokładnych obliczeń ułamków łańcuchowych, co po raz pierwszy zaproponował Gosper [3].. Ułamki łańcuchowe Skończony ułamek łańcuchowy to wyrażenie postaci () a 0 + a + a + a 3 +... + ak Słowa kluczowe. Dokładna arytmetyka liczb rzeczywistych, ułamki łańcuchowe, arytmetyka Gospera, szereg Ostrogradskiego-Sierpińskiego, leniwe wartościowanie, język programowania Python.

gdzie ogniwo a 0 jest liczbą całkowitą, a kolejne ogniwa a i dla i > 0 to liczby naturalne dodatnie, przy czym ostatnie ogniwo a k jest większe od [9, rozdz. XII]. Dla zaoszczędzenia miejsca zamiast wyrażenia () pisze się często [a 0 ; a, a, a 3,..., a k ]. Nieskończony ułamek łańcuchowy to granica ciągu ułamków skończonych [a 0 ; a, a, a 3,...] = lim k [a 0; a, a, a 3,..., a k ]. Każdą liczbę rzeczywistą można jednoznacznie przedstawić w postaci ułamka łańcuchowego, przy czym liczbom wymiernym odpowiadają skończone ułamki łańcuchowe, a liczbom niewymiernym nieskończone. Kolejne ogniwa ułamka łańcuchowego odpowiadającego danej liczbie wymiernej łatwo obliczać, stosując algorytm Euklidesa wyznaczania największego wspólnego dzielnika, np. 96 = 65 + 3 65 = 3 + 3 3 = 0 3 + 3 = 3, a zatem 96 = [;, 0, 3]. 65 Oto rozwinięcia niektórych liczb niewymiernych w ułamki łańcuchowe: = [;,,,,,,,,,,,...] = [ ;,,,,,,,,,,,...] 3 = [;,,,,,,,,,,,...] e = [;,,,, 4,,, 6,,, 8,...] e / = [;,,, 5,,, 9,,, 3,,...] tg(/) = [0;,, 4,, 8,,,, 6,, 0,...] π = [3; 7, 5,, 9,,,,,, 3,,...] 3 = [; 3,, 5,,, 4,,, 8,, 4,...]. Atrakcyjną własnością ułamków łańcuchowych jest to, że obcięte ułamki łańcuchowe (redukty) stanowią najlepsze możliwe przybliżenia liczb rzeczywistych. Po obliczeniu wartości początkowych ogniw rozwinięcia danej liczby rzeczywistej znana jest dokładność jej przybliżenia przez to rozwinięcie. Jest to spostrzeżenie kluczowe dla dalszej części pracy, w której przybliżane liczby są wynikami działań na innych ułamkach łańcuchowych. 3. Wymagane cechy języka programowania Do obliczeń na ułamkach łańcuchowych zgodnych z algorytmami przedstawionymi poniżej potrzebne są tylko liczby całkowite, jednak ich wartość bezwzględna może być dowolnie duża, większa niż pojemność słowa maszynowego. Aby zatem móc w jakimś języku programowania wygodnie zaimplementować podane algorytmy, powinien być w nim dostępny typ całkowity o nieograniczonym zbiorze dopuszczalnych wartości. Wymaganie to spełnia język Python od zawsze można w nim było korzystać z typu wbudowanego long, a od wersji.3, wydanej w 003 roku, został on w pełni zunifikowany z typem int, odpowiadającym słowu maszynowemu. Oznacza to, że wyrażenia całkowite, których wartość wykracza poza zakres typu int, są automatycznie konwertowane do typu long.

Sposób wykonywania obliczeń w opracowanej bibliotece różni się od zwykłego, gorliwego wartościowania (ang. eager evaluation). Opiera się on mianowicie na leniwym wartościowaniu (ang. lazy evaluation): przy tworzeniu wyrażenia arytmetycznego nie są wykonywane żadne obliczenia na liczbach. Zamiast tego powstaje skierowany acykliczny graf podwyrażeń. Od wierzchołka tego grafu, odpowiadającego całemu wyrażeniu, można następnie kolejno żądać tyle ogniw bądź cyfr dziesiętnych, ile zachodzi potrzeba. Wierzchołek ten z kolei żąda ogniw z wierzchołków z nim połączonych, które odpowiadają jego bezpośrednim podwyrażeniom, i tak dalej, aż do wierzchołków wejściowych, odpowiadających stałym liczbom. Dzięki leniwemu wartościowaniu wykonuje się tylko tyle obliczeń, ile jest w danej chwili potrzebne, a podwyrażenia dynamicznie dopasowują swoją dokładność, aby cyfry otrzymywane z wartościowania całego wyrażenia zawsze były prawidłowe. Istnieją języki programowania, np. Haskell [0], oparte w całości na koncepcji leniwego wartościowania, ale i w języku Python można z niego wygodnie korzystać dzięki generatorom, wprowadzonym do niego eksperymentalnie w wersji. i na stałe w wersji.3. Generatory są podobne do funkcji, zwracających tablice, lecz w odróżnieniu od nich przy kolejnych wywołaniach zwracają wynik element po elemencie. Dzięki temu funkcja wywołująca generator może rozpocząć przetwarzanie wyniku nie czekając, aż zostanie on w całości wygenerowany, co zresztą byłoby w ogóle niemożliwe, jeśli generator jest nieskończony. Ponieważ tworzenie wyrażeń arytmetycznych wiąże się z powstaniem grafu powiązanych zależnościami obiektów, konieczne jest zwalnianie pamięci, zajmowanej przez obiekt, gdy przestanie on być potrzebny, czyli przestaną być potrzebne wszystkie obiekty, które korzystały z wyników przezeń generowanych. Zarządzanie pamięcią znacznie się upraszcza przy zastosowaniu odśmiecania pamięci (ang. garbage collection), czyli automatycznego zwalniania niepotrzebnych obszarów pamięci. Język Python jest od swej pierwszej wersji wyposażony w automatyczny odśmiecacz pamięci. 4. Działania arytmetyczne Algorytmy czterech działań arytmetycznych na leniwie obliczanych ułamkach łańcuchowych podał Gosper [3, pkt. 0]. Polegają one na sprowadzeniu sum, różnic, iloczynów i ilorazów do ogólnej funkcji bihomograficznej, której kolejne ogniwa mogą być generowane na podstawie kolejnych generowanych na żądanie ogniw obu operandów. Każdy system dokładnej arytmetyki liczb rzeczywistych napotyka problem tego, że równość liczb niewymiernych jest nierozstrzygalna w skończonej liczbie kroków. Dotyczy to też opisywanego w tej pracy systemu: jeśli dowolnie wiele początkowych ogniw dwóch nieskończonych ułamków łańcuchowych jest parami równe, to nie wiadomo, czy kolejne ogniwa będą dalej parami równe. Problem nierostrzygalny występuje nie tylko przy porównywaniu liczb, ale i wtedy, gdy argumenty operacji są niewymierne, a jej wynik prawdopodobnie wymierny. Możliwe jest idealistyczne rozwiązanie tego problemu: udokumentowanie faktu, że takie obliczenia nigdy się nie skończą. Autor umożliwił taką wersję działania opracowanej biblioteki osiąga się ją przez ustawienie parametru k max, dostępnego dla programisty, na wartość ujemną. Domyślne ustawienie tego parametru jest jednak inne; autor sądzi, że bardziej praktyczne. Otóż jeśli algorytm Gospera wykona k max iteracji z jednakowymi wartościami dolnego i górnego ograniczenia na następne generowane ogniwo, to generuje owo górne ograniczenie, a po nim symbol None, oznaczający nieskończone ogniwo, czyli koniec ułamka łańcuchowego. Podobnie jeśli funkcja służąca do porównywania liczb pobierze po k max / parami równych ogniw z obu swoich argumentów, to decyduje, że są one równe. 3

Algorytm Gospera potrzebuje 8 iteracji, aby odkryć, że (math.sqrt(5) )/ ( 5 )/ > 0, gdzie math.sqrt() to funkcja obliczająca pierwiastek jako liczbę zmiennoprzecinkową, a funkcji porównującej liczby potrzeba 39 = 78/ iteracji, by odkryć, że powyższa odjemna i odjemnik są nierówne. Jest to przypadek pesymistyczny: każde ogniwo liczby ( 5 )/ odpowiada za przyrost dokładności o log 0 ( 5+)/ 0, cyfr dziesiętnych, jednak twierdzenie Lochsa [] głosi, że w prawie każdym (w sensie Lebesgue a) ułamku łańcuchowym każde kolejne ogniwo powoduje przyrost dokładności średnio o π /(6 ln ln 0),03 cyfry dziesiętnej. Badania empiryczne [] wskazują, że wariancja liczby cyfr dziesiętnych przypadających na jedno ogniwo wynosi w przybliżeniu 0,6. Po k max = 00 iteracjach z niezmienionymi wartościami dolnego i górnego ograniczenia na kolejne ogniwo liczba poprawnych cyfr po przecinku w wartości nie wygenerowanego jeszcze ogona ułamka łańcuchowego ma rozkład w przybliżeniu normalny z wartością oczekiwaną,03 00 i wariancją 0,6 00. Zatem różnica między dokładną wartością ogona a wygenerowaną liczbą całkowitą ma rozkład w przybliżeniu logarytmiczno-normalny o wartości oczekiwanej 0,03 00+(0,6 00 ln 0)/,07 00, czyli z grubsza pomiędzy 0 3 a 0 3. Algorytm generuje wtedy parę ogniw (a, ), podczas gdy poprawny wynik to ciąg (a, a,...) lub (a,, a,...), gdzie a 0 3, a 0 3. Zgodnie z twierdzeniem Gaussa-Kuźmina [3, 4] dowolne ogniwo w rozwinięciu prawie każdej liczby na ułamek łańcuchowy jest większe od n 0 = 0 3 z prawdopodobieństwem log ( + /n 0 ) = log ( + 0 3 ) 0 3 / ln,5 0 3. Zatem przy k max = 00 prawdopodobieństwo, że algorytm błędnie obetnie rozwinięcie losowej liczby w ułamek łańcuchowy nie przekracza wartości,5 0 3 pomnożonej przez liczbę obliczonych ogniw. Podobny problem występuje, gdy funkcja o argumentach niewymiernych ma wymierny wynik, np. e ln 5, czy cos(π/3). Został on podobnie rozwiązany w opracowanej bibliotece. Na rysunku przedstawiono sprawdzenie kilku przykładowych tożsamości, wykonane w trybie interaktywnym interpretera Pythona z zastosowaniem opracowanej biblioteki, a możliwe właśnie dzięki decyzji projektowej objaśnionej powyżej. W przedostatnim przykładzie porównywane liczby są nierówne, gdyż liczby zmiennoprzecinkowe to w gruncie rzeczy liczby wymierne o dużym mianowniku, a zatem skończone ułamki łańcuchowe, które mają mniej niż k max ogniw. W ostatnim przykładzie biblioteka sygnalizuje równość porównywanych liczb, ponieważ reprezentują je nieskończone ułamki łańcuchowe, z których porównano tylko k max początkowych ogniw. 4

>>> (sqrt() - )*(sqrt() + ). >>> sqrt(5 + *sqrt(6)) == sqrt() + sqrt(3) True >>> [sin(x)** + cos(x)** for x in... [pi*random(), pi*random(), pi*random()]] [.,.,.] >>> [cos(3*x)/cos(x) == cos(x)** - 3*sin(x)** for x in... [pi*random(), pi*random(), pi*random()]] [True, True, True] >>> [x == x + cf(0)**-000 for x in... [cf(random()), cf(random()), cf(random())]] [False, False, False] >>> sqrt() == sqrt() + cf(0)**-000 True Rysunek. Przykładowe tożsamości i wyniki ich sprawdzenia 5. Funkcje przestępne i π Do funkcji przestępnych zalicza się funkcję wykładniczą i logarytmiczną oraz funkcje trygonometryczne i cyklometryczne. Nie wszystkie z nich trzeba było bezpośrednio implementować w opracowanej bibliotece, a to dzięki poniższym tożsamościom: ( ) / ( ) sin x = cos x = tg x ( tg x arc sin x = arc tg + tg x ) / ( + tg x x x arc cos x = π/ arc sin x x y = e y ln x log 0 x = ln x/ ln 0. Po uwzględnieniu tych tożsamości, aby uzyskać zastępnik standardowej biblioteki math, pozostaje zdefiniować funkcje sqrt(), exp(), tan(), log(), atan() oraz liczbę pi. Leniwy algorytm obliczania pierwiastka kwadratowego oparto na metodzie Newtona (stycznych), dzięki czemu jest on szybszy, niż przy zastosowaniu tożsamości x / = e (ln x)/. Algorytm rozpoczyna się od obliczenia wartości a, równej całkowitoliczbowemu przybliżeniu x. Tak długo, jak ogniwa liczb a i x/a są równe, należy je emitować; w przeciwnym wypadku należy obliczyć następne przybliżenie a := (a+x/a)/. Zbieżność tego algorytmu jest kwadratowa, co oznacza, że po każdym kolejnym wyznaczeniu wartości a liczba poprawnych cyfr dziesiętnych wyniku w przybliżeniu się podwaja. Algorytmy obliczania wartości pozostałych funkcji przestępnych autor oparł na rozwijaniu argumentu w szereg Ostrogradskiego drugiego rodzaju [5], który poprawniej powinien się zwać szeregiem Ostrogradskiego-Sierpińskiego [6]: x = x + /q /q + /q 3 /q 4 +..., gdzie kolejne mianowniki q k wybiera się zachłannie największe z możliwych, przy zachowaniu tego, by kolejne sumy częściowe szeregu przybliżały x na przemian z dołu i z góry. 5 )

Po składniku ±/q kolejny składnik jest co do wartości bezwzględnej równy co najwyżej /(q + q), zatem liczba poprawnych cyfr w przybliżeniu co najmniej się podwaja z każdym składnikiem. Przypadkiem pesymistycznym jest rozwijanie w szereg Ostrogradskiego-Sierpińskiego liczb o części ułamkowej równej stałej Cahena / / + /6 /4 + /806 /36344 + /0650056950806... Leniwe obliczanie wartości funkcji e x polega na leniwym rozwijaniu x w szereg Ostrogradskiego-Sierpińskiego z pamiętaniem dwóch ostatnich sum częściowych s k i s k oraz zastosowaniu poniższych zależności do obliczania e s k i e s k : e /q = [; q,,, 3q,,, 5q,...], e x+y = e x e y, e x y = e x /e y. Tak długo, jak ogniwa liczb e s k i e s k są równe, należy je emitować; w przeciwnym przypadku należy obliczyć następną sumę częściową s k+. Algorytm leniwego obliczania wartości tg x jest analogiczny, z tym, że korzysta z zależności tg(/q) = [0; q,, 3q,, 5q,, 7q,...], tg(x ± y) = tg x ± tg y tg x tg y. Wartość ln x oblicza się leniwie, leniwie znajdując sumy częściowe szeregu Ostrogradskiego-Sierpińskiego tak, żeby e s k < x e s k lub e s k > x e s k. Tak długo, jak ogniwa liczb s k i s k są równe, należy je emitować; w przypadku ich nierówności obliczyć następną sumę częściową s k+. Wartości funkcji arc tg x oblicza się tak samo, jak logarytmu naturalnego, tylko z tg s k i tg s k zamiast e s k i e s k. Kwadratowa zbieżność powyższych algorytmów wynika z kwadratowej zbieżności szeregu Ostrogradskiego-Sierpińskiego. Liczbę π oblicza się leniwie na podstawie uogólnionego ułamka łańcuchowego π = 3 + 6 + 6 + 9 5 6 + 49 6 + 8... Algorytm ten ma zbieżność liniową, ale okazał się w praktyce szybszy od algorytmów o wyższym rzędzie zbieżności. 6. Podsumowanie Autor opracował bibliotekę dokładnych obliczeń na liczbach rzeczywistych w języku programowania Python, opartą na leniwie wartościowanych ułamkach łańcuchowych. Z adresu WWW http://sun.aei.polsl.pl/~mciura/cf.py można pobrać kod źródłowy biblioteki. Działania arytmetyczne w opracowanej bibliotece opierają się na algorytmie Gospera, przy czym autor wprowadził doń heurystykę, przerywającą pętle nieskończone. Wartości funkcji przestępnych są obliczane przez autorskie algorytmy, oparte na rozwijaniu liczb w szereg Ostrogradskiego-Sierpińskiego. 6

Opracowana biblioteka może znaleźć zastosowanie przy badaniu zjawisk chaotycznych, w geometrii obliczeniowej i numerycznej teorii liczb, a także w programach edukacyjnych. Szybkość wykonywania działań arytmetycznych jest zadowalająca, natomiast czas potrzebny do obliczenia wyników bardziej skomplikowanych wyrażeń zawierających funkcje przestępne można liczyć nawet w sekundach. Literatura [] G. van Rossum, F.L. Drake, Jr. (ed.), The Python Language Reference Manual (version.5), Network Theory Ltd, 006. [] The GMP Team, The GNU Multiple Precision Arithmetic Library, Free Software Foundation, 007. [3] M. Minsky, B. Gosper, M. Beeler et al., Artificial Intelligence Memo No. 39, Massachusetts Institute of Technology, A.I. Laboratory, 97. [4] J. Vuillemin, Exact real computer arithmetic with continued fractions, Proceedings of the 988 ACM conference on LISP and functional programming, ACM, 988, 4 7. [5] H.-J. Boehm, R. Cartwright, M. Riggle, M.J. O Donnell, Exact real arithmetic: a case study in higher order programming, Proceedings of the 986 ACM conference on LISP and functional programming, ACM, 986, 6 73. [6] K. Briggs, Implementing exact real arithmetic in Python, C++ and C, Theoretical Computer Science 35 (006), 74 8. [7] P. Potts, Exact real arithmetic using Möbius transformations, rozprawa doktorska, Department of Computing, Imperial College of Science, Technology and Medicine, University of London, 999. [8] M. Escardó, Introduction to Exact Numerical Computation, School of Computer Science, St. Andrews University, 000. [9] W. Sierpiński, Teoria liczb, PWN, 950. [0] S. Peyton Jones (red.), Haskell 98 language and libraries: the Revised Report, Cambridge University Press, 003. [] G. Lochs, Vergleich der Genauigkeit von Dezimalbruch und Kettenbruch, Abhandlungen aus dem Mathematischen Seminar der Universität Hamburg 7 (964), 4 44. [] W. Bosma, K. Dajani, C. Kraaikamp, Entropy and counting correct digits, Raport nr 995, Department of Mathematics, University of Nijmegen, 999. [3] C.F. Gauß, Werke, tom 0, 55 556. [4] R.O. Kuzmin, Sur un problème de Gauss, Atti del Congresso Internazionale dei Matematici, Bologna, 98, 83 89. [5] J.J. Remez, O zakonomiernych riadach, kotoryje mogut byt swiazany s dwumia ałgoritmami M. W. Ostrogradskogo dla pribliżenija irracyonalnych czisieł, Uspiechi matiematiczeskich nauk 6 (95), 33 4. [6] W. Sierpiński, O kilku algorytmach dla rozwijania liczb rzeczywistych na szeregi, Sprawozdania z posiedzeń Towarzystwa Naukowego Warszawskiego, Wydział III 4 (9), 56 77. Instytut Informatyki, Politechnika Śląska, 44-00 Gliwice Adres poczty elektronicznej: Marcin.Ciura@polsl.pl 7