This is my first Haskell skript. An enumeration function called fusion

Werbung
This is my first Haskell skript. An enumeration function called fusion, i. e.
the Cantor pairing function, and the inverse called split:
-- fusion
f :: (Fractional a) ⇒ a → a → a
f x y = (1 / 2) ∗ (x + y) ∗ (x + y + 1) + y
-- split
s :: (RealFrac a, Floating a) ⇒ a → (a, a)
s z = (x , y) where
j = getJ z
y = z − (auxF j )
x =j −y
-- auxiliary functions
auxF :: (Fractional a) ⇒ a → a
auxF j = (1 / 2) ∗ j ∗ (j + 1)
getJ :: (Num a1 , RealFrac a, Floating a) ⇒ a → a1
getJ z = w where
q = (−1 / 2) + sqrt (1 / 4 + 2 ∗ z )
w = fromInteger (truncate q)
-------------------------------------------------------------------- Beispiel: Welches Zahlenpaar repraesentiert die Zahl 17?
----- Dazu bestimmt man zunaechst eine Zahl j, die die groesste --- Zahl ist, fuer die gilt auxF(j) kleiner gleich 17. Das
--- laesst sich am einfachsten durch Ausprobieren ermitteln.
--- Dabei hilft die Wertetabelle von auxF(j):
----j
1
2
3
4
5
6
--auxF(j)
1
3
6
10
15
21
----- Damit ergibt sich j zu 5.
----- Dann ist y = 17 - auxF(j) = 17 - f(5) = 17 - 15 = 2.
--- Und x = j - y = 5 - 2 = 3.
----- Also ist <3,2> = 17.
------------------------------------------------------------------
1
Herunterladen