希望您玩得開心挑戰4 。 將來,如果您有什麼想法可以成為一個很好的挑戰,請告訴我。 我一直在尋找好的材料!
恭喜, @落在!您在 100 對 1,000 位數字(9.88 秒)和最長數字(7,150)挑戰中都取得了最快的(非工作人員)參賽成績。 它不僅是唯一能夠在10 秒內讀取所有100 對1,000 位數字的腳本(下一個最接近的只能讀取10 個),而且它還可以將兩個數字相乘,比下一個最接近的條目大3.5 倍! 此外,它是所有劇本(職員和非職員)中最短的,只有 1,000 多個字元。 我已將其包含在下面的腳本中。 四次挑戰後的總分為:
在討論大數相乘之前,我們先討論數字字串的解包或向量化——將數字字串轉換為數字向量。 正如我們上個月所看到的,使用一次一個來解析一串數字子字串在一個循環中是非常慢的。 這給我們留下了兩個一般選擇:1)將字串解構為單獨的單元,然後將它們重新組合成可以轉換為向量的形式(使用解析,例如)或 2)使用模式匹配。 我最初的傾向是使用方法 1。 多年來,我一直拒絕學習 JSL 模式匹配函數。 工作量太大,資訊和例子太少,而且我太懶了。 我想我已經擁有我所需要的一切正規表示式功能,我非常了解的東西。 不再。
這些挑戰讓我對模式匹配的速度和效率大開眼界。 正如向我解釋的@Craige_Hales ,負責這些功能的開發人員和挑戰的定期參與者,JSL 中的模式匹配例程是其基礎正規表示式建成。 為了展示其效率,請執行以下程式碼向量化範例.JSL ,比較了四種不同的向量化方法。 我還在腳本中包含了一個簡短的函數來產生一長串隨機數。 對於一串 10,000 個數字,在循環中一次解析一個數字是迄今為止最慢的,在我的機器上大約需要 11 秒。 使用字和串聯列表將數字解構並重建為可以解析為向量的字串是世界上最好的(0.0965秒)。
使用做同樣的事情正規表示式和解析比 (0.08543) 稍好一些。 模式匹配將時間縮短了驚人的 4 倍 (0.02179)! 雖然時間差異對於 50,000 位數字來說非常小,但如果我們考慮 5,000,000 位數字,兩種解析方法都需要大約 10 分鐘,而模式匹配需要 2 秒,與其他方法不同,幾乎呈線性擴展! 如果您想了解有關 JSL 中模式匹配的更多信息,請查看由@Craige_Hales或者@大衛_伯納姆(誰有他自己的一些部落格文章包含更多資訊和範例.)
繼續進行乘法例程。 模式匹配用於所有向量化。 此外,第一個範例中使用了上次挑戰中最快的加法演算法。 第一種方法(乘法大慢.JSL )除了我們迄今為止在挑戰中學到的知識之外,沒有使用任何內容。 它一次將兩個數字相乘,並確保根據被乘數和乘數的位置添加零(例如,當百位數字乘以十位數字時添加五個零)。 儘管函數對輸入進行排序,因此第一個輸入更大,但這沒有任何好處。 執行相同數量的操作。 然而,這將在最後一個示例中發生變化。 此功能速度較慢,需要近 30 秒才能完成一組 100 個 100 位數字。
在乘法大更快.JSL暫存器中的位數從一位增加到七位,大約是 JSL 可以表示的位數的一半而不溢出。 當我們將兩個大的七位數字相乘時,其結果可能高達十四位數字,這種選擇的原因就很明顯了。 由於 7 位元暫存器可能包含 14 位元數字,因此必須變更上一個範例中使用的加法例程,以便將第 7 位元數字以外的任何內容傳送到下一個暫存器。 儘管如此,由於只需要考慮正數,因此產生的程式碼要短得多。 此外,對於 100 100 位數對的乘法,結果顯著改善(0.04375 秒)。 此實作還可以合理地完成 100 個 1000 位數字對的乘法(1.54 秒)。
透過一項簡單的更改,您可以走得更快。 而不是一次乘以一個暫存器,乘法大最快.JSL使用 JSL 矩陣運算將每個暫存器中較短的數字與整個較大的數字相乘。 這種方法比以前的方法更快,100 個 1,000 位數字對的計時時間為 0.3015 秒,提高了 5 倍。
而且你可以走得更快。 文件乘法大 – Brady.JSL雖然在 1,000 位數字相乘時速度稍慢,但當數字大小達到約 2,000 位數字及以上時,它的性能更佳。 這是透過改變運算順序來實現的,以便可以在同一循環中完成乘法和加法。 這背後的細節超出了我的範圍,但是@brady_brady告訴我他很樂意寫一篇簡短的文章,如果有興趣的話我可以加入這篇文章。 快點? 或許。 密碼學中通常使用兩種著名的乘法演算法,它們可以將乘法運算的數量從 O(n 2 ) 到在1.58 )或者降低。 因為它們需要更多的大數加法運算,所以很難說它們在 JSL 中是否會更快。 截至這篇文章,我嘗試過,但無法實現這兩種演算法的快速 JSL 版本。
2020 年 8 月 1 日:謝謝@Craige_Hales用於捕獲錯誤乘法大最快.JSL 。 我已經糾正了這個問題。 我還添加了Craige 的multiplyBig 腳本,我本來打算這樣做但忘記了。 他使用查找表作為加速演算法的一種方法(有一些注意事項)。 像往常一樣,他的劇本是徹底的評論。