2013-08-05 24 views
5

Mnożenie dwóch liczb można zdefiniować algorytmicznie w następujący sposób: "dodaj pierwszą liczbę do siebie kilka razy równą wartości drugiej liczby". Potęgowanie dwóch liczb może być zdefiniowane algorytmicznie w następujący sposób: "pomnóż pierwszą liczbę samodzielnie liczbę razy równą wartości drugiej liczby". Zastanawianie się nad tymi definicjami dla mnożenia i potęgowania rodzi kilka pytań ...Generalizowanie operatorów arytmetycznych

Po pierwsze, czy można zdefiniować klasę działań arytmetycznych rozpoczynając od dodania jako podstawowej operacji? Pisałem trochę kodu Haskell, aby przetestować ten pomysł:

order1 x y = x + y 
order2 x y = foldl (order1) x (replicate (y - 1) x) 
order3 x y = foldl (order2) x (replicate (y - 1) x) 
order4 x y = foldl (order3) x (replicate (y - 1) x) 
order5 x y = foldl (order4) x (replicate (y - 1) x) 

Rzeczywiście, pojęcie „order2” jest mnożenie i sens „order3” jest potęgowanie. W języku angielskim, o ile mi wiadomo, brakuje słów "orderN", gdzie N> 3. Czy wspólnota matematyczna ma coś ciekawego do powiedzenia na temat tych operacji?

Ponadto, biorąc pod uwagę rekurencyjne wygląd tych funkcji „zamówienie”, jak można napisać funkcję tak:

generalArithmetic :: Int -> Int -> Int -> Int 
generalArithmetic n x y = --Comment: what to put here? 

że oznacza mnożenie gdy n jest równe 2, gdy n oznacza potęgowanie wynosi 3 ... ?

Również, w jaki sposób można uogólnić te funkcje arytmetyczne, aby mogły działać na wszystkich liczbach rzeczywistych? Typ "replikacji" to przecież Int -> a -> [a].

+2

http://en.wikipedia.org/wiki/Tetration –

+1

ogólny wyraz jest [hyperoperation ] (http://en.wikipedia.org/wiki/Hyperoperation). – leftaroundabout

+4

Mnożenie/potęgowanie ** liczb naturalnych ** można zdefiniować jako powtarzające się zastosowania operacji "niższego rzędu". Trudniej powiedzieć, co to znaczy interpretować "x^-7,6" jako "mnożyć x przez siebie - 7,6 razy". – Ben

Odpowiedz

4

Tak. Możesz zacząć od arytmetycznej peano, ponieważ pierwsze zamówienie (przyrost)

Brainf*ck zawiera tylko inkrementację, dekrementację i sprawdzanie wartości niezerowej. Mimo to może wykonać dowolne obliczenia, które może wykonać każdy inny program komputerowy, o ile zawsze ma wystarczającą ilość pamięci i nie spieszy się z otrzymaniem odpowiedzi.

Taka właściwość nazywa się Turing completeness i Brainf*ck jest taka nawet bez wejścia i wyjścia. Tak więc z <, >, +, ,i można utworzyć program do rozwiązywania wszystkich problemów matematycznych rozwiązywanych przez inne języki programowania.

Do tej pory stworzyłem programy, które dodają do niego dodawanie, odejmowanie, średnie, mnożenie, dzielenie, moduł i pierwiastek kwadratowy.

2

W przypadku ktoś dba o definicji tego, co wcześniej nazywany „generalArithmetic”, to jest tutaj:

arithmetic n x y = if n == 0 
        then (x + y) 
        else foldl (arithmetic (n - 1)) x (replicate (y - 1) x) 
+0

Gdyby to była jakaś prawdziwa rzeczywistość, a ty byś w ogóle dbał o wydajność, chciałbyś również obsłużyć 'n == 1' i' n == 2' jako specjalne przypadki i użyć wbudowanego mnożenia i potęgowania tam . – firefrorefiddle

Powiązane problemy