与えられた数値の素因数分解を行うAppleScriptです。
素数チェックには、数値が小さい場合にはOLD Style AppleScriptの計算ルーチンを呼び出し、数値が大きい(=計算に時間がかかる)場合には外部フレームワーク「primeNumKit.framework」を呼び出すようにしています。
AppleScriptからのCocoaの機能呼び出しにも時間がかかるので、細かい処理を頻繁に呼び出すと意外とAppleScriptだけで処理したほうが速かったりします(素数チェックを行うためにループで割り算を行いますが、最大値は2から目的値の1/2まででよく、こうした地道な改善が予想外に効いています)。
そのため、計算量を見てどちらで処理するかを判定しています。
AppleScript名:簡単な素因数分解v5 |
— Created 2017-05-18 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "primeNumKit" –https://github.com/NazarYavornytskyy/prime-number-objc set aRes to getPrimeFactor(56) of me –> {2, 2, 2, 7} set aRes to getPrimeFactor(54) of me –> {2, 3, 3, 3} set aRes to getPrimeFactor(9999991) of me –> {9999991} –素数 –与えられた数を素因数分解する on getPrimeFactor(aTargNum) copy aTargNum to a set pFactList to {} repeat set pRes to checkPrimeNumber(a) of me if pRes = true then set the end of pFactList to a return pFactList end if set aFactor to checkFactor(a) of me set the end of pFactList to aFactor set a to a div aFactor end repeat end getPrimeFactor –素数チェック on checkPrimeNumber(aNum) if aNum < 10000 then –0.25秒以上かかりそうな処理はCocoaで処理(実測値ベース) return checkPrimeNumberSub1(aNum) of me else set aPrime to current application’s PrimeNumberHelper’s alloc()’s init() return (aPrime’s isPrime:aNum) as boolean end if end checkPrimeNumber –小さい数の場合の素数検出 on checkPrimeNumberSub1(aNum) repeat with i from 2 to (aNum div 2) if aNum mod i is equal to 0 then return i –false end if end repeat return true end checkPrimeNumberSub1 –素因数チェック on checkFactor(aNum) repeat with i from 2 to (aNum div 2) if aNum mod i is equal to 0 then return i end if end repeat end checkFactor |
More from my site
(Visited 28 times, 1 visits today)