ディスカッション

答えを見つけ、質問し、Alteryx の専門知識を共有してください。
解決済み

【共有】素数判定のカスタムフォーミュラ IsPrime()

gawa
16 - Nebula
16 - Nebula

Alteryxの数式エディタで利用する関数を自作することができます。その機能を利用し、与えられた数字が素数かどうかTrue/Falseで返すカスタムフォーミュラIsPrime()を作りました。以下サイトを参考に適切な場所に添付XMLを配置して使ってください。

https://help.alteryx.com/current/ja/designer/functions/build-custom-formula-functions.html

 

申し送り事項

・対応している数字は1000万までです。それを超えると判定できないので、素数であってもFalseで返ってきます。ご注意ください。

・行数が数万行レベルになると時間がかかります(既知の素数一覧と一致するかのロジックになってるので処理が重めです)

 

@AkimasaKajitani @Yoshiro_Fujimori @DaisukeTsuchiya @Qiu 

例のEuleryxで素数使う問題が多いので、作ってみました。Base-Aに抵触するのかは微妙ですが、まぁ個人で楽しむ分にはいいのかなと。

6件の返信6
Qiu
21 - Polaris
21 - Polaris

@gawa 
素晴らしいですね。使ったみたいと思います。

Yoshiro_Fujimori
15 - Aurora
15 - Aurora

Base-Aに抵触するのかは微妙ですが

判定の元となる素数のリストを Alteryx で求めたのであれば OK ではないかと。

gawa
16 - Nebula
16 - Nebula

C++による素数判定ロジックをDLL化してカスタム数式で利用できるようにしたバージョンです。添付ZipのXMLとDLLを同じところに配置してください。対応できる数字の上限はありません。また、処理が高速になっています(当方環境で1億個の素数判定10秒)。

 

C++のNative機能を活用すると、こんなに高速化できるんですね。夏休みの自由研究みたいで面白かったです。

DaisukeTsuchiya
14 - Magnetar
14 - Magnetar

@gawa 

"Accept as Solution"を押せる権限をもらったので、解決済みにしてみました。いやこれは凄いです。Alteryx の反復マクロでは、かなり高速化したつもりでも1000万件で1分半かかりました。

AkimasaKajitani
17 - Castor
17 - Castor

そもそもなんのために素数をカスタムフォーミュラで判定しようとしているのか、ですが、グローバルのコミュニティにて、Euleryxという数学のクイズを解くというイベント?が開催されています。現在本家のサイト https://projecteuler.net/about では957問まで公開されていますが、これをAlteryxで解いちゃおう、ということで、以下のコミュニティのスレッドでみなさん挑戦しています(日本のACEのみなさまが熱中しております)。

 

Euleryx: Let The Games Begin!

https://community.alteryx.com/t5/General-Discussions/Euleryx-Let-The-Games-Begin/td-p/1405584

 

常設されているミニAdvent of Codeみたいなものですかね・・・。

gawa
16 - Nebula
16 - Nebula

@DaisukeTsuchiya カスタム関数を使わずにAlteryxの純機能だけでどれくらい時間短縮できるか頑張ってみましたが、1,000万までの素数で45秒が限界でした。WF添付します。

短縮のTipsとして以下を活用しました:

・反復マクロより、行生成を使う方が速そうです(AoCで経験しているように、反復マクロはIteration間の処理が重い)

・2,3以外の素数は6N+1 or 6N-1になるので、調べる件数を減らせる

image.png

トップのソリューション投稿者