Archive for the 'primeNumKit' Category

2017/05/20 与えられた数が素数かどうかチェック(PrimeNumberHelper)

オープンソースのprime-number-objc(By NazarYavornytskyy)中のPrimeNumberHelperをFramework化した「primeNumKit」を呼び出して指定の数が素数かどうかをチェックするAppleScriptです。

また、「primeNumKit」を利用した素因数分解のScriptも掲載しておきます。

OS X 10.10以降用にビルドしたフレームワークのバイナリを用意しておきました。興味のある方は自己責任で~/Library/Frameworksフォルダに入れてお試しください。

–> Download Framework Binary

素数のチェックで対象の数が大きく、かつ素数である場合には処理に時間がかかってしまいます。一方で、チェック対象の数がそれほど大きくない場合には、AppleScriptだけでループ処理した方がObjective-Cのプログラムを呼び出すよりも高速なケースが多々あります。

そこで、場合分けしてAppleScriptとObjective-Cのプログラムを選択的に呼び出すようにすると演算性能を維持できるようです。応用範囲が広いため、素数のチェックは割と重要です。

AppleScript名:与えられた数が素数かどうかチェック(PrimeNumberHelper)
– Created 2017-05-18 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “primeNumKit”
–https://github.com/NazarYavornytskyy/prime-number-objc
–http://piyocast.com/as/archives/4656

set aPrime to current application’s PrimeNumberHelper’s alloc()’s init()
set a to 75777773
set aRes to (aPrime’s isPrime:a) as boolean

★Click Here to Open This Script 

AppleScript名:簡単な素因数分解v4
– 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
–http://piyocast.com/as/archives/4656

set aRes to getPrimeFactor(56) of me
–> {2, 3, 3}

set aRes to getPrimeFactor(4999999) of me
–> {2, 127}

set aRes to getPrimeFactor(9999991) of me
–> {1021} –素数

–与えられた数を素因数分解する
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 - 1
    if aNum mod i is equal to 0 then
      return false
    end if
  end repeat
  
return true
end checkPrimeNumberSub1

–素因数チェック
on checkFactor(aNum)
  repeat with i from 2 to aNum - 1
    if aNum mod i is equal to 0 then
      return i
    end if
  end repeat
end checkFactor

★Click Here to Open This Script