今回は数学ネタです.
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
レビュー時のiOSバージョン : iOS14.3
スポンサーリンク
ダウンロード
今回は大して難しい仕様ではありません.
素数となる数を入力後, それが(レシピ内でサポートしている)素数ならその原始根から好きに一つ選ぶとその指数表を表示します.
初投稿の時点で, 5から97までの素数とその原始根による指数表に対応しています.
(3は自明なので外しています)
レシピを見て分かる通り, 変数valueに追加する際に使われている「繰り返しインデックス」がn番目の指数に相当するため, この値だけを追加することで指数列となり, 他の演算などに活用することができます.
原始根とは
原始根を説明するのは正直難しいです.
簡単に言えば対数の整数版であり, それゆえ最近では「離散対数(discrete logarithm)」とも言われてるんだとか.
素数はともかく, ある数がその素数の原始根であるかどうか, 更に指数表となるだけの計算を行うのは結構面倒です.
RSA暗号に使われる概念で よく言われるのは
合成数となった異なる2つの素数を求める難しさ
ですが, 翻訳表とも言える指数表を求めるのもまた面倒な作業です.
過去の投稿で指数表を紹介しましたが文字数の問題で47までの素数しか収録していませんでした.
また2年前にショートカットレシピとして作ったことがありましたが処理速度がネックであまり良い結果ではありませんでした.
ショートカットでは数処理自体はこなせますがC言語を始めとするメジャーな高級言語と比べるとその速度は2桁も3桁も劣るシロモノです.
そのため複雑な計算や多くの繰り返し処理にはめっぽう弱いです.
内部データ
実はRoutineHubにレシピを投稿する直前までは, 一度パソコンで書いたものをiCloud Drive経由で反映させていました.
これはこれでいいんですが, 文字数によってはplist形式の辞書を「テキスト」アクションに直接書いても処理速度に影響がないことを確認したため, 今回は投稿したレシピ単体で使用可能となっています.
また昨日指摘した「入力から辞書を取得」で取り込んだキーの並びがバラバラになる現象は今回のケースでも起こるようなので, 同様の対処が行われています.
ちなみにplist辞書の中身(レシピ先頭にある「テキスト」アクションの中身)の一部がこちら.
画像は素数列です, "prime"をキーとして499までが配列として入っていますが後述の通り今回は3から97までしか最終的に受け付けません.
単体で使うなら問題ありません.
その次に並ぶのは各素数に対応する原始根です.
ここでは各素数の原始根を","で区切って一つのstringタグに格納しているため, 実際に使うには区切りを外して配列とする必要があります.
こちらも素数499の分までありますがこのレシピでは5から97までのものしか使っていません.
最後に指数表です.
既に書いた通りで一つの素数に原始根は(3を除いて)複数ありますから, 各素数のキーに対して更にdictタグで囲って各原始根の指数を入れています.
〆
ショートカットは便利ですがどうしても得手不得手があります.
不得手となる場合はこういうやり方にでもしないと実用に耐えないので仕方ありませんね.