Keep Hacking :)

Life is complex, it has both real and imaginary parts.

使用Regular Expression去驗證質數

我們都知道Regular Expression是一個很厲害的工具,但是它可以用來判斷質數,是不是聽起來有點嚇人:P

我們先來看一下程式碼:

1
2
3
4
5
class Fixnum
  def is_prime?
    ("1" * self) !~ /^1?$|^(11+?)\1+$/
  end
end

它是正確的嗎?

其實這是最重要的問題,如果它一點都不正確,那它一點都不值得討論。

讓我們來做一些驗證:

1
2
3
4
5
3.is_prime?
#it returns true

8.is_prime?
#it returns false

看起來好像是對的,不過這是爲什麼?我們總不能試了幾個整數就説它是正確的,這樣不太講道理。

神奇的黑魔法

其實原理很簡單,我們一段一段來解釋清楚。

首先是^1?$的部分,這段是用來解决當數字是0或者是1的特殊情况,所以當出現的數字是0或者是1的時候就會被比對到,程式就會輸出false

後面的^(11+?)\1+$是在做什麼呢?\1+是代表前面(11+?)的内容要重覆一次以上。哪(11+?)是幹什麼用的呢?它的作用就是用來比對長度從2開始1..1的字串,所以如果你輸入的數字是一個合數,那麼就會被比對成功,程式就會輸出false

所以老實說,我們不用太期待這個程式碼會多有效率,只是寫起來很酷罷了,Just for fun!

Comments