有理數可數
這是代數導論第一次作業的最後一題。我很自然地先(在 ghci 裡面)用 Haskell 做一遍再把它翻譯成比較像一般數學的語言 XD。
--
這應該可以當 Haskell 的入門練習題 XD。
程式碼就是很直觀地寫 XD。
import Data.Ratio cluster n = [ (n - i, i) | i <- [1..n-1] ] positive_rationals = map (uncurry (%)) . filter ((==1) . uncurry gcd) . concat . map cluster $ [2..] bijection x | x == 0 = 0 | odd x = positive_rationals !! ((x-1) `div` 2) | otherwise = -(positive_rationals !! ((x-2) `div` 2))
--
有錯就代表我作業寫錯了 ─ 不過我在作業裡面的自然數從 1 開始算 XD。
Labels: 雜記
可以 po 出程式碼嗎?:P
Updated. :)
喔喔 ...我以為是在 Haskell 證明出 function 是 bijection 的。
以前投機的作法是先弄 N x N 是可數的、可數集的子集是可數的,把 Q 塞到 N x N 裡去,搞定。(畢竟要實際造一個 bijection 不是每次都這麼直覺)
要證明的話就用 Agda 或 Coq 嘍。
看起來方法是一樣的。我真正寫的時候的確就是先把 N x N 拉成一個數列然後取這個數列的適當子數列,偷懶沒證「可數集的子集也可數」。不過我想代數導論的作業應該不用寫那麼嚴格吧 XD。
Enumerating the Rationals 還有更漂亮的方法喔。
啊,我都忘記有這篇了,之前沒仔細看 :P。
不知道用裡面的手法會不會讓這件事情在 Agda 裡面比較好證?再試試看嘍…
<< 回到主頁