星期一, 4月 26, 2010

cgdbrc

單純備個份,參考自網路上的,自己單純加了兩行,除非有必要,不然我應該是不會用 gdb 原生 XD (可能連 qemu 例外之類的 XD)。

以下放在 ~/.cgdb/cgdbrc

set arrowstyle=highlight
set autosourcereload
set tabstop=4
set winsplit=top_big
set showtgdbcommands
map <F2> :set<SPACE>winsplit=top_big<CR>
map <F3> :set<SPACE>winsplit=bottom_big<CR>
hi Statement cterm=bold ctermfg=6
hi PreProc cterm=bold ctermfg=4
hi IncSearch ctermfg=2
hi LineHighlight cterm=bold ctermfg=3 ctermbg=4

這樣子按 F2 或 F3 時即可選擇要放大上面視窗,還是放大下面視窗


---

星期四, 4月 22, 2010

Try

Try to explain something, but It's fail.


---
question or problem.

星期日, 4月 18, 2010

Perfume 與偶像

本篇同時在 love the Perfume World 與 No title, no thinking, no meaning 發表。

這個主題想寫很久了,但是寫出來只有一點點 XD

有一天,我和 allxxxxxts 在閒聊,他說有些 Perfume 在 A-Chan 唱歌的時候會一直喊 A~Chan,守住所謂的舊時代的榮光。但是 A~Chan 並不喜歡這樣子,我還蠻好奇的問了為什麼 XD?

因為這樣子 A~Chan 唱歌會不專心 XD

這答案真是出乎意外的簡單 XD,但是其實我對偶像開始思考是有一次我在李玟簽唱會說我的歌迷們,而張懸說聽眾開始想的。到底人們是怎麼看待偶像這回事的 ? 其實答案出乎意外的簡單,大概就跟我們這些寫 blog 的人一樣,寫自己想寫的,我們都很明白的知道寫 blog 的人不可能透露自己全部的事,但是確實也沒有必要將自己完全包裝 (這讓我想到某個日本團體 XXXXX XD),雖然忘了那個哲學家的思維是,沒有全部說出來就是謊謊,然後其實在事實上,我們對於大部分的人是可以接受的。

每個人在他的位置上就做好該位置的事,Perfume 大概就是我覺得很好的例子,可能 Perfume 是現在日本的一線偶像,她們是保持了部分真實在這個世界就可以了,其實我並不是很在乎她們跟我們的距離要多平民 XD 素人偶像其實就很平民,因為本來就從平民出身的 XD。

與其說是追星偶像,倒不如說,我們試著相信這樣子的人。


---
下次來討論 A~Chan, Nocchi, Yuka 三派的現象 XD

星期五, 4月 16, 2010

紀念不事生產的日子

Slide: Programming Tempratory Integrated Distributed Embedded System
僅紀念我這一兩個月不事生產的日子。

在 ycma 的指導下,我終於破破爛爛的讀完這篇 paper 了(還是是想完 XD?) 簡單的來說,就是學習如何建立 programming model ,學習怎麼樣思考問題,建立模型及描述進而解決問題。以後會做相關 paper 的問題嗎? 我想不會,我單純相信,這篇只是單純訓練而己。在這念這篇 paper 的過程中也學了 Haskell ,也決定了下個要念的主題 --- Precision-Time Machine

所有的事情也該繼續前進而不要再裝死了。該寫的 lambdawn, Perfume, Haskell 是該繼續進行了。


---
希望能繼續過著開心的生活。

星期一, 3月 29, 2010

學習雜想

ycma 要我推導的東西,我終於推出一點頭緒來,不過不知道是不是他要的。從這個中間體會到慢即是快,現在竟然非常習慣在紙上書寫所有的想法,以前總是要盡量的把所有東西電子化,其實現在也可以,寫完掃起來就好了,也不是一件很麻煩的事 XD。

現在思考比較不會想要用電腦,習慣靜靜的想,想的過程中也不會想用電腦,很大的原因是,在那個當下,用電腦並不會幫助我思考,所以我可以專心在紙筆上,可能是體會到了一點,我正在想我想要解決的問題,所以脫離是有可能的。也因為這個樣子,希望自己的桌子簡單一些好吧。

這個禮拜一忙起來是要人命,花了一天半的時間在搞 onlinejudge system ,寫程式還是適合集中時間,不過集中時間的同時,每天空兩三個小時下來想問題是必要的。對現在的我而言,用 Python 操作 List 總是會覺得用 Haskell 來操作會來的更好玩些。用 List 會想到我第一次上 Database 時,jdwei 教 Relational Algebra,重新定義了所有 symbol 與其操作方式,每個產生都是一個 table,就可以用這套 Algebra 來做展開或化簡,這是我第一次覺得 Algebra 很好用,Boolean Algebra 沒有辦法給我這樣子的感覺大概是操作的東西比較小,讓我會直覺認為就是如此。而在 Haskell 的 List 操作也讓我有相同的感覺,今天才想到,稍微延伸一下,如果我們把一個 type 及其操作視為一個 Algebra,沒有 side effect 的影響下,這應該是很容易成立的(如果不要轉型的話 XD),只是對於 function 而言,我們可能會得到一個 fun:: a -> b 的映射,這恐怕就要另外再想想了,用我目前的破爛數學大概是想不到什麼東西 XDXD。寫到這裡,突然讓我想到 Josh Ko 提及的一本書 "The Algebra of Programming",不知道要裡面寫了什麼? 算哩,繼續學習吧,就不要想太多了。


---
相當有趣。

星期三, 3月 24, 2010

十年鑄一劍,今請攖其鋒

這其實是唐鳳在以前"我的資訊探索"對自己下的評語,約在四五年前,看到這段文字沒什麼感覺,今日再看,感觸不少。

其實不想再陳腔爛調說自己要多努力之類的,但是可以談談別的,從我開始寫程式的那一刻到現在也很多年了,總是警告自己不要以為自己會了就想飛翔了,總是要忍耐,因為我不知道自己缺少了什麼,在這一陣子,學習如何建立數學模型(到現在還是沒有學會 XD),真的不知道自己會建出怎麼樣的東西,但是在那之前只能等待了。

我的人生對於一般人而言算是相當平順的,這很大的成得要感謝我的爸媽,但是,離我自己的目標,我想就有如這句話吧。

之前跟某個老師聊天時,他說他要玩 Facebook 上的小遊戲,不然做研究會很無聊做不下去,也提及到多看看學生現在做什麼才不會脫節。老實說,我人生對於大部分的人而言己經越來越無聊了,MSN 關的時間比以前長上不少,想事情學習的時間幾乎佔了大部分,休息就是想另外一個問題,煩了就是睡覺。連我自己都很好奇,這樣子的生活我覺得很棒,我不知道別人怎麼想,至少我很喜歡我現在的生活。一切即劍的生活。


---
鑄

星期二, 3月 23, 2010

Haskell Practice - Natural Number

其實就照著書上的教學盡量自己推然後寫,大概是看了 fold fusion ,直觀意義大概就是直接代入後可以少一層,然而這樣子做的好處在 function compose 上可能會少一些動作吧。這篇大概是做個紀錄。不過對我自己而言,做這個練習算是讓我體會到很多事,所有的事都可以依靠簡單的元素來完成時,真的是一件很漂亮的事 !!


data Nat = Zero | Succ Nat
    deriving(Show)

createNat :: Integer -> Nat
createNat i = createNat' i Zero

createNat' :: Integer -> Nat -> Nat
createNat' 0 n = n
createNat' i n = createNat' (i-1) (Succ n)

plusNat :: Nat -> Nat -> Nat
plusNat m Zero = m
plusNat m (Succ n) = Succ (m `plusNat` n)

multNat :: Nat -> Nat -> Nat
multNat m Zero = Zero
multNat Zero n = Zero
multNat (Succ m) (Succ n) = (multNat (Succ m) n) `plusNat` (Succ m)

divNat :: Nat -> Nat -> Nat
divNat (Succ m) Zero = undefined
divNat Zero _ = Zero
divNat (Succ m) (Succ n)
    | (Succ m) == (Succ n) = Succ Zero
    | (Succ m) < (Succ n) = Zero
    | (Succ m) > (Succ n) = (Succ Zero) `plusNat` (divNat ((Succ m) `subNat` (Succ n)) (Succ n))

exponNat :: Nat -> Nat -> Nat
exponNat m Zero = (Succ Zero)
exponNat (Succ m) (Succ n) = (exponNat (Succ m) n) `multNat` (Succ m)

instance Eq Nat where
    Zero == Zero = True
    Zero == Succ n = False
    Succ m == Zero = False
    Succ m == Succ n = (m==n)

    Zero /= Zero = not(Zero == Zero)
    Zero /= Succ n = True 
    Succ m /= Zero = True 
    Succ m /= Succ n = not(m==n)

instance Ord Nat where
    Zero < Zero = False
    Zero < Succ n = True
    Succ m < Zero = False
    Succ m < Succ n = (m= Zero = True 
    Zero >= Succ n = False 
    Succ m >= Zero = True 
    Succ m >= Succ n = not(m Zero = False
    Zero > Succ n = False 
    Succ m > Zero = True 
    Succ m > Succ n = (m>n)
    
    Zero <= Zero = True 
    Zero <= Succ n = True 
    Succ m <= Zero = False 
    Succ m <= Succ n = not(m>n)

    max m n = if m > n then m else n
    min m n = if m < n then m else n

subNat :: Nat -> Nat -> Nat
subNat m Zero = m
subNat (Succ m) (Succ n) 
    | (Succ m) < (Succ n) = undefined
    | otherwise = subNat m n

factNat :: Nat -> Nat
factNat Zero = Succ Zero
factNat (Succ m) = (Succ m) `multNat` (factNat m)

fibNat :: Nat -> Nat
fibNat Zero = Succ Zero
fibNat (Succ Zero) = Succ Zero
fibNat (Succ (Succ m)) = (fibNat (Succ m)) `plusNat` (fibNat m)

infinity :: Nat
infinity = Succ infinity


---
不知道這篇會不會破壞版面 XD。

星期日, 3月 21, 2010

Perfume - ナチュラルに恋して (New Single)

本文同時在 *love the Perfume World* 與 No title, no thinking, no meaning 發表

其實 Perfume 已經很久沒有發表新單曲了,去年光靠 One Room Disco 就唱了一整年 XD,能出新單曲我們這些聽歌的人算是可喜可賀 XD

進入正題,一開始的背景音樂讓我覺得有點電子化 (因為這本來就是電音),但是 Perfume 三人聲音之後,可能是把三個人的聲音調的比較機械聲 XD? 這種感覺說不上來,但是很像兩種極端但是互補,所以聽起來相當的輕鬆。

就 PV 而言,我一直覺得三個人在變漂亮,然後我看 A~Chan 在跳舞時,我竟然會想到 Michael Jackson 的月球漫步(掩面),兩個風格是差蠻多的,但是我就是會想到 ... Orz 但是這次的 PV 跟以往的不同是廣告商很有錢電子感覺比較少了(以前或多或少都有電腦動畫,從 ORD 之後好像就比較沒有了?)

歌詞方面就不做感想哩,一方面是不會日文只會看翻譯(歌詞有部分翻譯),一方面是沒看到完整版,就 ... (跑)


---
相當開心聽到這首歌 :)

星期四, 3月 18, 2010

轉換

先提一下,我偷用了 Josh Ko 的 blog subtitle,將這個 blog subtitle 改成 Let's see how far we can go. 我自己也想看看,到底我們能走多遠,我們的其他人是誰呢 ? 其實對我而言也不是這樣重要,人總是會來來往往,在當下的時間與到朋友,或許那就是我們。也是會有持續走下去的朋友,所以我並不擔心。

或許,現在的我還在不斷的轉換吧。人生就是不斷的 Disco Disco Disco XD。

最近一直很閒,也是最忙的時候,因為忙著做想做的事,忙著做研究(我應該是這個字都提不上的人 XD),忙著超越自己,我的人生中很少以別人做目標,就跟我跟 Josh Ko 第一次聊天說的一樣,我沒有把任何人當偶像過,我唯一能做的是不斷的超越自己。或許也是因為這樣子想法,造成我現在的自大與無知吧(笑)

最近無論看什麼書都覺得自己有很長的路要走,老實說,我不怎麼害怕,但是的確有想自己要怎麼走下去,因為現在的我是不怎麼滿意的,雖然每天都會做到事,但是效率太低了。

其實我一點都不懂研究是什麼,想法跟以前一樣,大抵是提出一個創新的想法,或加以改善前人的做法。這樣子講是很空洞的,所以最近不斷的寫(紙筆或這個 blog) 用來學習一件事,藉以探索如何創造想法,不過似乎到目前為止都是失敗的,但是不急,我會持續到有結果再來看下一步吧。


---
似乎跟轉換沒什麼關係 XD。

星期一, 3月 15, 2010

雜想

昨天很晚睡今天卻很早就醒了,看來以後還是少喝飲料店的茶好了,睡不到六個小時的感覺其實不是很好 XD。醒來之後看了看自己的桌上,只有鉛筆,紙,書本,水杯,也很難得桌上只剩這些簡潔的東西了...

這個學期表面上要做的事大幅度的減少了,實際上要做的事卻比以前更多了。所以是時候得跟開學第一個禮拜一樣,過著比較規律的生活。

睡覺前還在想,直到現在還是無法忘記第一次看到 Introduction to Functional Programming using Haskell 的 Chapter 3,只靠著 data Nat = Zero | Succ Nat 再加以其他設定即可描述整個 Natural Number System (Josh 說公設系統都是如此XD),這樣子的簡單可以建構出複雜,真的是一件很感動的事 ! 而 Haskell 對於 List 的操作,Python 幾乎可以依樣畫葫蘆XD,但是對於 data type 的 recursive define,從 Real World Haskell 來說,用 OO 的 Polymorphism 來解也不會這麼簡潔漂亮,Haskell 對於 List 的操作固然是一絕,但是我覺得重點是 data type 還有 function 的操作,我想,我的學習只是剛開始而己。為什麼我要寫 Haskell ,因為這是一個讓我覺得寫作起來最為自由,思考可以很直覺的在操作上的語言。當然有不少的好處與不少的限制,限制之所以成為限制是因為人們不喜歡這個條件,好處則反之,對我而言,就是一堆條件吧 XD。

其實有想過給系上學弟妹做一個演講,談談我對程式設計與電腦的想法,不過大概沒什麼機會也不會有人理我,所以大概是自己在 blog 上寫一篇就收工了 XDXDXD,然後在寫這篇之前,會先寫 Perfume XD


---
其實我也分不出雜想與最近有什麼差別 XD。

星期五, 3月 12, 2010

Haskell Practice - Ugly Numbers

題目就在這,我就不再多做說明了,這題寫完,暫時要停下來,把 scm 老師的信消化,然後鳥書繼續前進 XD。

is_un n
    | n == 1 = True
    | n `mod` 2 == 0 = is_un (truncate (fromIntegral n/fromIntegral 2))
    | n `mod` 3 == 0 = is_un (truncate (fromIntegral n/fromIntegral 3))
    | n `mod` 5 == 0 = is_un (truncate (fromIntegral n/fromIntegral 5))
    | otherwise = False


is_un2 n
    | n == 1 = True
    | n `mod` 2 == 0 = is_un2 (until (\x -> x `mod` 2 /= 0) (\x -> truncate (fromIntegral x/ fromIntegral 2)) n) 
    | n `mod` 3 == 0 = is_un2 (until (\x -> x `mod` 3 /= 0) (\x -> truncate (fromIntegral x/ fromIntegral 3)) n)
    | n `mod` 5 == 0 = is_un2 (until (\x -> x `mod` 5 /= 0) (\x -> truncate (fromIntegral x/ fromIntegral 5)) n)
    | otherwise = False

is_un3 n = foldl judge n [2,3,5] == 1
    where judge n y = until (\x -> x `mod` y /= 0) (\x -> truncate (fromIntegral x/ fromIntegral y)) n

un_list :: [Integer] -> Integer -> [Integer]
un_list (x:xs) n 
    | n == 0 = (x:xs)
    | otherwise = un_list (min:x:xs) (n-1) 
    where min = minimum (filter (>x) [u*v | u<-(x:xs), v<-[2, 3, 5]])

傳說中這題是一行就可以寫完的,但是我不知道怎麼寫,我還是一樣照我的想法寫 XD,剛開始的想法非常簡單,一直除 2, 3, 5,最後的結果不等於 1 就不是,這方法當然很慢,不過練習還是有用的,因為從 is_un 至 is_un3 可以讓我練一下 foldl ,也讓我明確的了解到 foldl 和 foldr 的根本性不同 (沒錯,我之前又完全搞錯了,剩下只有 fold fusion 要搞懂了)

最後一個 un_list 的想法則是比較正面,找到前面 list 乘於 2, 3, 5 然後大於 list 最大的數的數列最小值,這速度顯然快很多 XD。在這樣子的狀況下寫成 tail recursive 比較直覺,但是其實將整個數列反過來算也是 ok 的,所以我就索性反過來算了。測試結果如下 ...

*Main> reverse (un_list [5, 4, 3, 2, 1] 1495)
[1,2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,30,32,36,40,45,48,50,54,60,64,72,75,80,81,90,96,100,108,120,125,128,135,144,150,160,162,180,192,200,216,225,240,243,250,256,270,288, ...

同場加映 Python 版,不過真的只能說 Haskell 影響 Python 很深,在 list 操作部分很像,但是沒有 Haskell 來的漂亮 XD

def ugly_number(list_size):
    ug_list = [1]
    for i in range(0, list_size-1):
        ug_list.append(min(filter(lambda x: x>ug_list[len(ug_list)-1], [x*y for x in ug_list for y in [2,3,5]])))
    return ug_list

---
該繼續打底了 ... XD


2010/03/15 05:58 pm 今天晚上可能無法再做練習了,可能要先看一下 paper ,不過初步的破爛想法是

makePrime x = if prime (x+add) then (x+add)
            else makePrime (x+add) 
            where add = if x `mod` 6 == 1 then 4 else 2
primes = 5: map primeCircule2 primes

其實不是沒有想過一次生二個 element (試著寫 let p = 5:7: map (6+) p),但是回傳時一定要產生一個 element,如果不是的時候總不能丟 0 XD,所以只好先交出一個破爛方法,剩下的明天再試。


2010/03/18 11:06 am 後來想到兩個數列分開算再用 merge 即可,不過速度上應該是佔不到便宜就是了 ...

makePrime_plusn n x = if prime (x+n) then (x+n) else makePrime_plusn n (x+6) 
primes = 5: map makePrime primes
primes2 = merge primes_plus2 primes_plus4 
    where primes_plus2 = 5: map (makePrime_plusn 6) primes_plus2 
          primes_plus4 = 7: map (makePrime_plusn 6) primes_plus4

星期四, 3月 11, 2010

Haskell Practice - Merge Sort

老實說我也不太清楚是不是 Merge Sort ,只是照著感覺寫,而且感覺是效率不佳的 Merge Sort ... Orz,其中的 merge 是 scm 老師寫的,他寫了一封信,我很認真的看再很認真的忘掉再重寫中。

insertionSort [] = []
insertionSort (x:xs) = merge [x] (insertionSort xs)

merge [] ys = ys
merge xs [] = xs
merge (x:xs) (y:ys) 
    | x <= y = x : merge xs (y:ys)
    | otherwise = y : merge (x:xs) ys

測試結果如下:

*Main> mergeSort [3,1,5,2,6, -1, 10]
[-1,1,2,3,5,6,10]

---
想要改寫,不過應該是晚上的事了。


事情比想像中更糟,自己推一次,發現根本不是 Merge Sort 啊 ... Orz


上面那個應該是 insertion sort ... 緊急之間寫了下面這個 code 出來,但是會出錯 ... meeting 在即,等回來再說了 ...

mergeSort [] = []
mergeSort x = 
    if length x > 1 then 
        merge (mergeSort (fst (splitAt half x))) (mergeSort (snd (splitAt half x)))
    else x
    where half = truncate ( (fromIntegral (length x))/ (fromIntegral 2))

看起來是沒有出錯了,接下來該開始思考怎麼寫會比較好一點 XD。


2010/03/12 00:09 結果根本就在惡補怎麼操作 list ,發現自己是有看了,但是都忘完了 ... 到目前為止的版本

mergeSort (x:xs) 
    | xs == [] = [x]
    | otherwise = merge (mergeSort (take half (x:xs))) (mergeSort (drop half (x:xs)))
    where half = truncate ( (fromIntegral (length (x:xs)))/ (fromIntegral 2))

2009/03/12 10:19 AM 只是嘗試將 length 帶入 argument 中,實質上並無太大改變,我一直在想著長度的問題 ... 可是腦袋又是空掉了 ...

mergeSort [] = []
mergeSort x = mergeSort' x (length x) 

mergeSort' x l
    | l == 1 = x
    | otherwise = merge (mergeSort' (take half x) half) (mergeSort' (drop half x) (l-half))
    where half = truncate ((fromIntegral l)/(fromIntegral 2))

2009/03/14 11:38 pm 依 scm 在 comments 裡的建議把 uninterleave 寫出來,自己重寫 interleave ,發現有一點不太一樣(還好功能一樣 XD)
interleave [] ys = ys
interleave xs [] = xs
interleave (x:xs) (y:ys) = x:y:(interleave xs ys)
-- interleave (x:xs) (y:ys) = x:(interleave (y:ys) xs)

uninterleave :: [a] -> ([a],[a])
uninterleave [] = ([], [])
uninterleave (x:xs) = uninterleave' (x:xs) [] [] 

uninterleave':: [a] -> [a] -> [a] -> ([a], [a])
uninterleave' [] ys zs = (zs, ys)
uninterleave' (x:xs) ys zs = uninterleave' xs zs (x:ys)

mergeSort2 :: (Ord t) => [t] -> [t]
mergeSort2 [] = []
mergeSort2 (x:[])  = [x]
mergeSort2 xs = merge (mergeSort2 (fst (uninterleave xs))) (mergeSort2 (snd(uninterleave xs)))

星期二, 3月 09, 2010

Haskell Practice - Prime (2)

在寫了一個第一篇之後,scm 老師給予了很多建議

scm 提到...
Interesting code :). Some comments:
  1. 如你所說 isPrime 是 map 加上 foldr (不過這個 isPrime 測的好像是「不是質數」?)。另外,makePrimeList 是 filter.
  2. 其實 (&&) 這個 operator 碰到第一個參數是 False 的時候也並不會去算第二個。isPrime2 和 isPrime 的另一個不同點是碰到 y < sq 就停下來吧?這也可以用先做一個 takeWhile 達成。
  3. 用 makeList 的版本為什麼比較慢不能馬上斷定,一個猜測是和 x ++ [c] 有關係。串列的 (++) 花的時間和第一個參數的長度成正比,所以每產生一個新的 c 都得從最開頭把這個串列旅行一遍。
    另外,由於 makeList 是 tail recursive 的,makePrimeList 必須等到整個 6n+1 6n+5 的串列產生完畢後才能動作。(比較之下 makePrimeList_2 則可以隨到隨做,[2..x] 這個 list 的元素生出來、測試過後,就丟掉了,並不佔空間。)不知道 makeList 會不會使得 heap 使用量變大,GC 變多,程式就慢了。你可寫一個不是 tail recursive 的 makeList 試試看嗎?

所以第一個問題 isPrime 是錯的,因為我一開始是寫 notPrime XD,但是問題算小,我馬上重寫了一下(順帶一提, scm 老師說的 && 特性,我不確定 Haskell 有,現在知道有了,記得這有一個名詞稱呼這種特性,但是忘了是什麼,在寫 C/C++ 時很常用,大部分是用在 pointer check is not null 上。)

prime :: Integer -> Bool
prime x 
    | x == 2 = True
    | otherwise = 
        isPrime x [2..sq]
        where sq = truncate (sqrt (fromIntegral x)) + 1

isPrime :: Integer -> [Integer] -> Bool
isPrime x y
    | x == 2 = True
    | otherwise =
         case y of 
             [] -> True
             y:ys -> (x `mod` y /= 0) && isPrime x ys

這樣子應該就沒有錯了...(汗),然後我們再很快速的寫成 map 格式,也連帶的使用到 lambda function ,因為我不知道怎麼樣寫的比較精簡了 XD

isPrime4 :: Integer -> [Integer] -> Bool
isPrime4 x y
    | x == 2 || y == [] = True
    | otherwise = and (map ( \e -> x `mod` e /= 0) y)
--     | otherwise = and (map (/=0) (map (x `mod`) y)) 

接著我再把稍微改版的程式試著用 takeWhile 改寫(takeWhile 的相對是 dropWhile)

isPrime5 :: Integer -> [Integer] -> Bool
isPrime5 x y 
    | x == 2 = True
    | otherwise =
        isPrime5' x (takeWhile  (< (truncate (sqrt (fromIntegral x)) + 1)) y)

isPrime5' :: Integer -> [Integer] -> Bool
isPrime5' x y =
     case y of
         [] -> True
         y:ys -> (x `mod` y /= 0) && isPrime5' x ys

最後一個問題就是 makeList,我就沒有寫了,我把 makePrimeList 寫成如下型式

makePrimeList4 :: Integer -> [Integer]
makePrimeList4 x = [2, 3] ++ makePrimeList4' 5 x False [] 

makePrimeList4' :: Integer -> Integer -> Bool -> [Integer] -> [Integer]
makePrimeList4' c e b x
    = if c < e then
          if isPrime5 c x then
              makePrimeList4' (c+add) e (not b) (x ++ [c])
          else 
              makePrimeList4' (c+add) e (not b) x
      else x
      where add = if b then 4 else 2

這樣子的 code 就不需要另外產生 list ,因為產生的當下就檢查,不要就丟掉了,然而在生成 prime list 的時候還是 tail recursive ,有嘗試過另外的方法,卻發現快不起來。

如果要將 (x ++ [c]) 變成 ([c] ++ x),我嘗試寫了另外一個 isPrime7

isPrime7 :: Integer -> [Integer] -> Bool
isPrime7 x y 
    | x == 2 = True
    | otherwise =
        isPrime5' x (dropWhile (> (truncate (sqrt (fromIntegral x)) + 1)) y)

這樣子的確可以完全避免掉 tail recursive 的問題,但是速度會比較慢,因為產生的數列是 11 7 5 3 2 這樣子的排序,一般檢查是否為質數是正向檢查,逆向的時候能夠在檢查次數上佔到的便宜其實不多 (如果該數是被 5 整除的話...),所以這樣子寫反而比較慢,目前的想法是,如果想要完全漂亮的解決 tail recursive 問題的話,勢必是得重新設計方法而且更了解這個語言的。

---
可見自己數學真的不好 ... Orz

星期一, 3月 08, 2010

Haskell Pratice - Prime

今日目標算是達成了,明天再繼續。原始想法很簡單,如何寫出一個 prime list ? 於是我就寫了第一版

prime :: Integer -> Bool
prime x 
    | x == 2 = True
    | otherwise = 
            isPrime [2..sq] x
            where sq = truncate (sqrt (fromIntegral x)) + 1

isPrime :: [Integer] -> Integer -> Bool
isPrime x y =
    case x of 
        [] -> False
        x:xs -> (y `mod` x == 0) || isPrime xs

makePrimeList :: [Integer] -> [Integer]
makePrimeList x =
    case x of
        [] -> [] 
        x:xs -> if prime x then  
                    [x] ++ makePrimeList xs
                else 
                    makePrimeList xs

其中的 where sq = truncate (sqrt (fromIntegral x)) + 1 是在 Josh Ko 的幫助下寫出來的,但是我得隔日再戰,我很明確的知道是轉型問題,但是並不是能夠完全說清楚為什麼要這樣做(他有說明,但是我得再看一下書)。

而且在這一版中的 isPrime 實在是太暴力了,其實可以用 map + and (or fold) 寫出來,並不一定要用 recursive 寫,所以我採用了另外一個寫法,即是檢查到 `mod` == 0 就停下來。

isPrime_2 :: Integer -> [Integer] -> Bool
isPrime_2 x y
    | x == 2 = True
    | otherwise =
        case y of
            [] -> True
            y:ys -> if y < sq then
                        if (x `mod` y == 0) then False
                        else isPrime_2 x ys
                    else True 
                    where sq = truncate (sqrt (fromIntegral x)) + 1

速度是明顯快上不少,但這版對我而言只剩最後一個問題,就是每呼叫一次 sq 就要算一次,我目前唯一想到的解法是,把 sq 也當成引數,於是我就寫成

isPrime_3 :: Integer -> [Integer] -> Bool
isPrime_3 x y 
    | x == 2 = True
    | otherwise =
        isPrime_3' x y (truncate (sqrt (fromIntegral x)) + 1)

isPrime_3' :: Integer -> [Integer] -> Integer -> Bool
isPrime_3' x y sq =
    case y of
        [] -> True
        y:ys -> if y < sq then
                    if (x `mod` y == 0) then False
                    else isPrime_3' x ys sq
                else True

最後,再寫一個 makePrimeList 的 code 就搞定了

makePrimeList :: Integer -> [Integer]
makePrimeList x = makePrimeList_2 [2..x] []

makePrimeList_2 :: [Integer] -> [Integer] -> [Integer]
makePrimeList_2 u v =
    case u of 
        [] -> []
        x:xs -> if isPrime_3 x v then
                    [x] ++ makePrimeList_2 xs (v++[x])
                else
                    makePrimeList_2 xs v

最後 run 一下成果

*Main> makePrimeList 100
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]

其實還可以更快,但是就明天再來來,依現在的程度寫出的 code ,雖然普通,可是很開心。

---
本週目標:練習 Prime


馬上就打了自己的嘴吧,我試著嘗試產生 6n+1 6n+5 的 list 用以減少 prime 的檢查次數,於是很粗糙的寫了如下的 code

makeList :: Integer -> Integer -> Bool -> [Integer] -> [Integer]
makeList e c b x =
    if c < e then
        if b then
            makeList e (c+4) False (x ++ [c])
        else
            makeList e (c+2) True (x ++ [c])
    else
        x

然後將 makePrimeList 改成如下

makePrimeList :: Integer -> [Integer]
makePrimeList x = makePrimeList_2 ([2, 3] ++ makeList x 5 False []) []

結果速度反而慢到嚇人啊...Orz 完全不知道為什麼,看來要好好研究了 XD。

星期日, 3月 07, 2010

愛的 ... ?

某天我把 Clara 說給我的話說給 gb014388 聽之後,他在白板上是這樣子寫的

Clara: 愛的抱抱相反是冷漠。

---
XD

星期二, 3月 02, 2010

趕工

這幾天一直在用 Python + Django 趕一個小型系統,我本來一點都不會 Django,但是還好會 Session 和 POST 這種很基礎的概念,所以硬幹起來還算快,接下來想辦法把這個系統改寫然後丟到 Apache Server + mod_python 上就算暫時告一段落了,接下來在嵐達網就要繼續正常發文了,這個 blog 的文章也要持續的寫作下去。

如果有關任何 Django 的筆記,我就直接放在 wiki 上,就不轉過來了 XD。

雖然這個系統很趕很破爛,不過我還決定幫這個系統命名一下(寫程式不太行,惡搞倒是很強 XD),Cobra Online Judge System XDXD,可以找個人畫眼鏡娘當作代表圖案嗎 XD


---
不像筆記的記錄 XD。

星期日, 2月 28, 2010

FLOLAC 10

FLOLAC 10
今年應該沒什麼能擋住我了吧 XD?


---
一定要去成 !

星期五, 2月 26, 2010

今日笑話


保護當事人,還有我的本名,我看到我就笑了 XD


---
以後走在路上報本名比較不會被打 XD

星期四, 2月 25, 2010

Django 撰寫

突然之間要我一個禮拜多一點就寫出一個小型的 web service,我立馬想到的是 PHP,但是我實在是不太想用 PHP 寫,大概是對於 weak type 有一種出自本能的害怕 XD,這次改用 Python + Django 撰寫這個 Service ,覺得 MTV (Model-Templat-View) 的架構,其實 PHP 做的出來,只是我之前沒想過,這次寫 Django 就算作給自己的一個全新練習吧 XD。不過我還是不想學 CSS ,這對不會美工的人而言還是太痛苦了 XD。

如果以後有需要,可以重新學一個 CMS 的相關開發或者是 PHP Framework 開發,應該會對這一行不會感到這麼陌生,不過我比較想要關心的是 PHP 的 hit-hop compiler ,但是至少要等這個禮拜過完吧 XDXD。


---
寫到一段落再說 XD。

星期日, 2月 21, 2010

改變與開始

所有的事正要改變嗎? 其實只是一個開始。


---
沒有答案的旅程。