もう一人のY君

iPhoneアプリのレビューやアップデートレビューなどを書いています. たまに数学の記事も書きます.

もう一人のY君 MENU  MENU

【iPhoneショートカット】2次、3次方程式の実数解を求めるレシピ【修正】

 以前紹介したものを少し修正しました.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.4.1

 

 

スポンサーリンク

 


 

 

 

ダウンロードと使い方

www.icloud.com

 前回と使い方自体は変わりません.

 

 

 まず3次関数か2次関数を選択し、それに応じて係数と区間を入力していきます.

 

 

 結果を表示して終了します.

 

 

修正点

 入力した係数によっては0や1が存在します.

 その場合例えば1x^3-0x…といった表示ではちょっとかっこ悪いです.

 

 

 そこで(レシピの中身はかっこ悪いですが)テキストの置き換えと正規表現でそういった「かっこ悪い表示」を取り除いた上で結果を表示するよう変更しました.

 

 こういうのを自然に修正してくれるアクションが欲しいです.

 

 

【iPhoneショートカット】MathJaxで数式を表示

f:id:thetheorier:20220125112703p:plain

 手軽に  \LaTeXの数式が書けます.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.2.1

 

 

スポンサーリンク

 


 

 

 

ダウンロードと使い方

routinehub.co

 

 

f:id:thetheorier:20220125113017p:plain

 レシピ先頭の「テキスト」アクションに予め用意しておいたサンプルコードがあり、「入力済みのテキスト」を選ぶとそちらを使って表示します.

 もちろん好きに書き換えて使えます.

 

 

f:id:thetheorier:20220125113210p:plain

 MathJaxであるためhtmlの知識もある程度必要になりますが、数式だけ書きたい場合は$$で囲めばいい…とだけ覚えれば大丈夫です.

 

 

youtu.be

 

 

フロー

f:id:thetheorier:20220125113519p:plain

 先頭にある「テキスト」アクションはサンプル・固定用のものです.

 

f:id:thetheorier:20220125113611p:plain

 内容によってフォントサイズを変更したい場合があるため2つ目の「辞書」アクションから変更するようにしてあります.

 

 

f:id:thetheorier:20220125113713p:plain

 続いて「メニュー」アクションで固定テキストか手打ちするかを選択します(プロンプトテキストは配布したレシピでは変更されています).

 

 

f:id:thetheorier:20220125113831p:plain

 固定テキストを選ぶ場合は「テキスト」アクションに最初の「テキスト」の中身を当てます.

 

f:id:thetheorier:20220125113931p:plain

 手打ちの場合はテキストの中身を「入力を要求」で打ち込ませます.

 bodyタグの中身だけ書けば十分です.

 

 

f:id:thetheorier:20220125114047p:plain

 「メニューから選択」を抜けて、「テキスト」アクションでhtmlを書き込みます.

 titleタグは実際には見えないので無視してよいです.

 

 

f:id:thetheorier:20220125114354p:plain

 上のhtmlコードを「HTMLからリッチテキストを作成」でリッチテキストに変換し、更にこれを「PDFを作成」でPDF化します.

 余白やページ番号の指定は状況に応じて変更してください.

 これを更にイメージに変換し、表示します(イメージにするかは好みです).

 

 

 既存のアプリで \LaTeX を書くアプリはいくつかありますが、専用のキーボードを使ったり、日本語を交えた文章が作れなかったり、underbraceのような特殊なものが使えなかったり…とかゆいところに手が届かなったりします.

 

 

blog.thetheorier.com

blog.thetheorier.com

 MathLMは人が手打ちするには面倒すぎですし、Google Chart APIは「非推奨」なのでいつ使えなくなるかわかりません.

 

 これなら大いに使えます.

 

 

【iPhoneショートカット】数字を閉区間、開区間でフィルタする【応用】

f:id:thetheorier:20220106085004p:plain

 前回からコンテンツを増やします.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.2.1

 

 

スポンサーリンク

 


 

 

 

ダウンロード

routinehub.co

 

 実際に体験するのが早いでしょう.

 

 

f:id:thetheorier:20220114154143p:plain

 前回投稿した開区間、閉区間に加えふたつの半開区間から選択できます.

 その後入力した実数が選択した区間に含まれるかどうかを判定するレシピです.

 

 画像の通りショートカットでの小数点以下の精度にも対応します(小数点以下の精度は16桁).

 

 

f:id:thetheorier:20220114154519p:plain

 半開区間の判定も熟します.

 

 

 

前回

blog.thetheorier.com

 前回紹介したのは開区間と閉区間でした.

(そういえば閉区間としてならif文一つで済みましたね)

 

二次関数を使って代入した値の正負(または0)によって判定するというものです.

 

 今回は半開区間について考えてみます.

 

 

端点と範囲外の扱い

 半開区間の場合は前回のようにはいきません.

 

 通常の指数関数を使う手もあるんですが、代入する値が大きくなると簡単にオーバーフローしたり小数点以下で丸められてしまうデメリットがあるため使えません.

 

 今回は底を-1とする指数関数と二次関数を併用します.

 

 ここでは左半開区間(a,b]で考えます.

 

 

f:id:thetheorier:20220114140917p:plain

 画像のように、数直線上に点a,bがあるのをイメージします.

 半開区間(a,b]のエリアは緑の範囲内ですが、端点に相当する境界線が問題になります.

 

 

f:id:thetheorier:20220114141127p:plain

 理想は上の画像のようなグラフを作ることです.

 このとき値が正である場合、その値は半開区間(a,b]に含まれることになります.

 しかし、ショートカットの各種アクションの組み合わせではおそらく不可能です.

 

 そこで段階を踏んでこれに似たようなものを作ります(実際には対して似ていませんが).

 ようは以下の4点を満たす関数であればなんでも良いわけです

 

  1.  f(a)=0
  2.  a\lt c\lt bなる実数cについて、 f(c)\lt 0
  3.  f(b)\lt 0
  4. 上記を除く変数 xについて、 f(x)\leq 0

 

 区間[a,b]における正負の判定が重要のため、上の条件4は緩いものとなります.

 理想はすべて0とはじめに書きましたが、条件1~3を満たすためであれば負数でも問題ないわけです.

 

 

 

f:id:thetheorier:20220114141354p:plain

 というわけでまずは画像のような周期関数を作ることを考えます(分離している箇所は黒で埋まっている点の方が値).

 周期関数の代表例は三角関数ですが、度数法にしろ弧度法にしろ変数の扱いがややこしくなるため、今回は上で触れた指数関数 (-1)^x を使います.

 

 しかしこの関数  (-1)^x \mathbb{R}\to\mathbb{R} でのグラフ化など、そのままでは厄介な存在です.

 

 そこで指数xは、代わりに小数点以下一位を四捨五入したものに差し替えます.

 

 ショートカットの「計算機」であれば

 

(-1)^(rint(入力))

 

、あるいはWolframAlphaであれば

 

(-1)^(Round(x))

 

になります.

 

ja.wolframalpha.com

 

 しかしこれだとグラフを見てわかる通り、希望の状態から0.5だけズレています.

 

 そこで入力(変数)を1/2だけ引いて全体を右に1/2ズラします.

 

ja.wolframalpha.com

 

 これで原点での値が1、間隔1の方形周期関数が得られます.

 

 しかしこれで終わりではありません.

 これを好きな閉区間[a,b]上で1となるようにするため、更にパラメータを加えます.

 

 この辺は説明すると蛇足気味になるので省略しますが、x=a~bで1、両側で-1となる方形周期関数は、今回の場合以下で得られます.

 

 

\displaystyle (-1)^{\displaystyle Round\left( \frac{x-a}{b-a}-\frac{1}{2} \right)}

 

 ショートカットの「計算機」アクションでは、Roundでなくrintになります.

 またレシピでは範囲外を0にするためにここから1を足したものを使います.

 

 

ja.wolframalpha.com

 上はa=-1、b=2の場合をWolframAlphaで計算したものです.

 

 

 

 さて、このままでは区間[a,b]以外にも正の区間があるためまだ十分ではありません.

 不要な区間を何らかの形で0以下にする必要があります.

 

 そこで二次関数を使います.

 

 

f:id:thetheorier:20220114150629p:plain

 具体的には、上の画像のような、

 

  •  f(a)=0
  • 上に凸
  • 頂点の x 座標が x=a+b

 

を満たす二次関数を使います.

 これを満たす二次関数が例えば

 

 y=-(x-a)(x+a-2b)

 

であることは容易にわかります.

 

 

f:id:thetheorier:20220114150715p:plain

 これと上で作った方形周期関数(に1を足したもの)をかけ合わせると画像のようになります.

 

f:id:thetheorier:20220114150602p:plain

 見やすくすると画像のようになります.

 これで目的は達成されます.

 

 

 というわけで最後の関数は以下で表わせられます.

 

\displaystyle \left( (-1)^{\displaystyle rint\left( \frac{x-a}{b-a}-\frac{1}{2} \right)} + 1 \right)\times (-1)(x-a)(x+a-2b)

 

 この式の変数 x に代入した値が正であればその値は区間(a,b]に含まれており、非負であれば含まれない…ということになります.

 

 同様に、もうひとつの半開区間[a,b)の場合は以下となります.

 

\displaystyle \left( (-1)^{\displaystyle rint\left( \frac{x-a}{b-a}-\frac{1}{2} \right)} + 1 \right)\times (-1)(x-b)(x-2a+b)

 

 

 指標となる値が計算できれば、後はif文で場合分けするだけです.

 

 

 

レシピ化

 配布したレシピは開区間、閉区間を含む4種から選択し、入力した値がその区間に含まれるかどうかをシンプルに判定します.

 

 

f:id:thetheorier:20220114135912p:plain

 前回同様、端点の値は「辞書」アクションを使います.

 

 「メニューから選択」で4種の区間から選ばせます. 開区間、閉区間については省略します.

 

 

f:id:thetheorier:20220114152841p:plain

 「入力を要求」で実数を入力させ、先程の関数に沿って「計算機」アクションで値を計算します.

 

 

f:id:thetheorier:20220114153620p:plain

 結果が0より大きいならば、区間に含まれる旨のテキストを作り変数に代入します.

 

 

f:id:thetheorier:20220114153737p:plain

 そうでない場合も同様に.

 

 

f:id:thetheorier:20220114153831p:plain

 新たに「メニューから選択」を追加し、プロンプトに上で作ったテキスト(の変数)を入れ、やり直すか終了するかを選択させます.

 結果を「結果を表示」で表示させて終わり、またレシピを実行しなおし…は面倒ですからね.

 

 

 これよりもシンプルで大小の値に対応できる関数はいくらでもあると思います.

 

 現状ここで紹介したケースも、二次関数を使用している影響で大きな値に対してそれなりに小さな負数、つまり絶対値を取って大きくなるためやはりある程度大きな数になると限界が来ます.

 その次善策としては前回も紹介したように、因数 (x-a)  (x+a-2b) ごとに予めある程度の定数で割っておくことです.

 アクション数が増えるデメリットもあるので目的によっては不要かもしれません.

 

 

 

【数学】指数表に幾何学的特徴を見る(修正)

f:id:thetheorier:20210317140516p:plain

 以前紹介したものを少し修正したものです.

 

 

 

スポンサーリンク

 

 

 

前回の投稿

blog.thetheorier.com

 前回と言ってももう4年以上前ですね.

 原始根や指数の定義はもはや割愛しますが, 指数表を図式化することで何か特徴を見いだせないか…と思ったのがことの始まりでした.

 

 

描画ルールを変更

f:id:thetheorier:20210317140858p:plain

 前回は素数pに対して単位円をp等分して隣り合う指数の値を繋げました.

 ある程度の傾向は評価できましたが互いに平行に近い, しかし平行でない組があってなんともモヤモヤした結果でしたね.

 

 

f:id:thetheorier:20210317141242p:plain

 というわけでこれをp-1等分するよう変更しました.

 

 

f:id:thetheorier:20210317141349p:plain

 すると画像の通り, 指数表の「中央」を除いたすべての組が互いに平行になります.

 最初からこうすれば良かったですね.

 

 

 

f:id:thetheorier:20210317141621p:plain

 しかもよくよく見ると, 同じ素数に関する指数表のうち, 対応する2組が上下の線対称の関係にあることがわかります.

 

 

f:id:thetheorier:20210317144508p:plain

 

f:id:thetheorier:20210317144549p:plain

 上はp=13の場合でしたが例えばp=17でも結果は同じでした.

 どうやら原始根を小さい順に並べたとき, 1つ目と3つ目, 2つ目と4つ目, 5つ目と7つ目, 6つ目と8つ目…という組み合わせでこの傾向があるようです.

 

 

 

f:id:thetheorier:20210317144835p:plain

 この傾向は指数表自体からも伺い知れます.

 画像のように, 各指数が前回からいくつ増えたか, あるいは減ったか…の値がちょうど反転しています.

 

 

f:id:thetheorier:20210317145000p:plain

 p=13, r=6,11の場合もやはり同じ関係にあります.

 

 しかしここでInd(2)-Ind(1)だけ一致しませんね.

 これは余り難しい話でなく, 指数においてa≡b (mod p)のときInd(a)≡Ind(b) (mod p-1)が成り立ちます.

 

 よってr=7の場合でのInd(2)-Ind(1)=11は11-(13-1)=-1と合同であり, これは+1の反元です.

 同様にr=11の場合のInd(2)-Ind(1)=7は7-(13-1)=-5であり, これは+5の反元です.

 

 

p=37までの図表

 ここから見いだせる性質はないか色々考えていたんですがそう簡単にはいかないものです.

 とりあえずp=37まで作り直しました(前回は29まででしたが), 参考までに.

 

 

p=5

f:id:thetheorier:20210317150302p:plain

 p=5,r=2

 

f:id:thetheorier:20210317150349p:plain

 p=5,r=3

 

 

p=7

f:id:thetheorier:20210317150442p:plain

 p=7,r=3

 

f:id:thetheorier:20210317150511p:plain

 p=7,r=5

 

 

p=11

f:id:thetheorier:20210317150636p:plain

 p=11,r=2

 

f:id:thetheorier:20210317150713p:plain

 p=11,r=6

 

f:id:thetheorier:20210317150845p:plain

 p=11,r=7

 

f:id:thetheorier:20210317150925p:plain

 p=11,r=8

 

 

p=13

f:id:thetheorier:20210317151017p:plain

 p=13,r=2

 

f:id:thetheorier:20210317151100p:plain

 p=13,r=6

 

f:id:thetheorier:20210317151142p:plain

 p=13,r=7

 

f:id:thetheorier:20210317151224p:plain

 p=13,r=11

 

 

p=13

f:id:thetheorier:20210317151323p:plain

 p=17,r=3

 

f:id:thetheorier:20210317151400p:plain

 p=17,r=5

 

f:id:thetheorier:20210317151503p:plain

 p=17,r=6

 

f:id:thetheorier:20210317151539p:plain

 p=17,r=7

 

f:id:thetheorier:20210317151621p:plain

 p=17,r=10

 

f:id:thetheorier:20210317151701p:plain

 p=17,r=11

 

f:id:thetheorier:20210317151739p:plain

 p=17,r=12

 

f:id:thetheorier:20210317151817p:plain

 p=17,r=14

 

 

p=19

f:id:thetheorier:20210317151908p:plain

 p=19,r=2

 

f:id:thetheorier:20210317151947p:plain

 p=19,r=3

 

f:id:thetheorier:20210317152032p:plain

 p=19,r=10

 

f:id:thetheorier:20210317152107p:plain

 p=19,r=13

 

f:id:thetheorier:20210317152147p:plain

 p=19,r=14

 

f:id:thetheorier:20210317152223p:plain

 p=19,r=15

 

 

p=23

f:id:thetheorier:20210317152309p:plain

 p=23,r=5

 

f:id:thetheorier:20210317152342p:plain

 p=23,r=7

 

f:id:thetheorier:20210317152419p:plain

 p=23,r=10

 

f:id:thetheorier:20210317152459p:plain

 p=23,r=11

 

f:id:thetheorier:20210317152521p:plain

 p=23,r=14

 

f:id:thetheorier:20210317152543p:plain

 p=23,r=15

 

f:id:thetheorier:20210317152603p:plain

 p=23,r=17

 

f:id:thetheorier:20210317152631p:plain

 p=23,r=19

 

f:id:thetheorier:20210317152655p:plain

 p=23,r=20

 

f:id:thetheorier:20210317152721p:plain

 p=23,r=21

 

 

p=29

f:id:thetheorier:20210317152800p:plain

 p=29,r=2

 

f:id:thetheorier:20210317152825p:plain

 p=29,r=3

 

f:id:thetheorier:20210317152852p:plain

 p=29,r=8

 

f:id:thetheorier:20210317152918p:plain

 p=29,r=10

 

f:id:thetheorier:20210317152941p:plain

 p=29,r=11

 

f:id:thetheorier:20210317153011p:plain

 p=29,r=14

 

f:id:thetheorier:20210317153037p:plain

 p=29,r=15

 

f:id:thetheorier:20210317153108p:plain

 p=29,r=18

 

f:id:thetheorier:20210317153139p:plain

 p=29,r=19

 

f:id:thetheorier:20210317153205p:plain

 p=29,r=21

 

f:id:thetheorier:20210317153235p:plain

 p=29,r=26

 

f:id:thetheorier:20210317153300p:plain

 p=29,r=27

 

 

p=31

f:id:thetheorier:20210317153341p:plain

 p=31,r=3

 

f:id:thetheorier:20210317153425p:plain

 p=31,r=11

 

f:id:thetheorier:20210317153450p:plain

 p=31,r=12

 

f:id:thetheorier:20210317153517p:plain

 p=31,r=13

 

f:id:thetheorier:20210317153543p:plain

 p=31,r=17

 

f:id:thetheorier:20210317153615p:plain

 p=31,r=21

 

f:id:thetheorier:20210317153643p:plain

 p=31,r=22

 

f:id:thetheorier:20210317153709p:plain

 p=31,r=24

 

 

p=37

f:id:thetheorier:20210317153746p:plain

 p=37,r=2

 

f:id:thetheorier:20210317153817p:plain

 p=37,r=5

 

f:id:thetheorier:20210317153839p:plain

 p=37,r=13

 

f:id:thetheorier:20210317153911p:plain

 p=37,r=15

 

f:id:thetheorier:20210317153934p:plain

 p=37,r=17

 

f:id:thetheorier:20210317153957p:plain

 p=37,r=18

 

f:id:thetheorier:20210317154020p:plain

 p=37,r=19

 

f:id:thetheorier:20210317154043p:plain

 p=37,r=20

 

f:id:thetheorier:20210317154542p:plain

 p=37,r=22

 

f:id:thetheorier:20210317154603p:plain

 p=37,r=24

 

f:id:thetheorier:20210317154623p:plain

 p=37,r=32

 

f:id:thetheorier:20210317154646p:plain

 p=37,r=35

 

 

 

【iPhoneショートカット】数式の画像を作成する【LaTeX】

f:id:thetheorier:20210306144358p:plain

 LaTeXとAPIを使って数式の画像を作ります.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS14.4

 

 

スポンサーリンク

 

 

 

Google Chart API

developers.google.com

 使用するのはGoogle Chart APIというもの.

 ただこれ, 既に「非推奨」とされているみたいなのでいつ使えなくなるかわりません.

 とは言ってもそうなってから9年くらい経つみたいですが.

 

 このAPI自体は別に数式だけじゃなく, 名前の通り様々なグラフをパラメータとすることで結果を画像にしてくれます.

 テキスト形式のパラメータもあり, そこでLaTeX構文の数式を書ける…というわけです.

 

 

htmlで記述

 まずはweb形式で表示してみます.

 

 

f:id:thetheorier:20210306150336p:plain

 後でやりやすいよう, 予め「テキスト」アクションを置いてそこに数式だけ書くスタイルにします.

 そもそもAPIで投げる際にURLエンコードが必要のためどのみち画像のように記述した数式構文を「URLエンコード」でエンコードすることになるので.

 

 

f:id:thetheorier:20210306150643p:plain

 続けてhtml本文です.

 今回はAPIで拾ってくるのでMathJaxのような読み方でなく, 

 

http://chart.apis.google.com/chart?

 

という形のURLを呼ぶだけです.

 実際にはこの後ろにパラメータをくっつけるわけで, 例えば画像にある順だと1つ目の"cht"はテーマで, txはテキストの意味です.

 "chs"はサイズ, 正しくは縦の長さ(ピクセル?)のようです.

 "chl"は本文です, 今回はこの後ろにLaTex(をエンコードしたもの)が入ります.

 

 

f:id:thetheorier:20210306152607p:plain

 あとはこれを「HTMLからリッチテキストを作成」でリッチテキストにし, 「クイックルック」でプレビューします.

 

 

f:id:thetheorier:20210306152743p:plain

 構文に誤りがなければ画像のようになります.

 

 

f:id:thetheorier:20210306152853p:plain

 先程の通り, パラメータchsは縦幅のようなので, 例えば画像のように改行して2行3行と書いていくと…

 

 

f:id:thetheorier:20210306153007p:plain

 どんどん小さくなってしまいます.

 

 

f:id:thetheorier:20210306153058p:plain

 なのでchsの値は適切に選ぶ必要があります.

 

 

f:id:thetheorier:20210306153414p:plain

 頑張れば多少複雑な数式も…

 

 

f:id:thetheorier:20210306153602p:plain

 このようにそれなりに書くことができます.

 ただ通常とまったく同じにできるわけではないようで, 条件は不明ですが\displaystyleコマンドを入れると結果が表示されない場合があったり, また\textコマンドも使えないようです.

 \displaystyleなどがないと見た目がちょっと残念になったりするのでちゃんと使えると嬉しいんですが仕方ないですね.

 

 

APIとして取り込む

 上でやってることもAPIによるものですが, htmlを介したやり方という意味では変則的でした.

 なので今度は画像を直接取得します.

 

 

f:id:thetheorier:20210306154034p:plain

 先程と同じように数式をURLエンコードしたものを, 同じカスタムURLにくっつけます.

 

 

f:id:thetheorier:20210306154214p:plain

 このURLを「URLの内容を取得」で拾うだけです.

 

 

 

f:id:thetheorier:20210306154315p:plain

 実行して得た(画像)ファイルがこちら.

 

 

blog.thetheorier.com

 先日紹介したMathLMは人が書くにはめんどくさいのでそれに比べたらとても簡単です.

 

 本当はショートカットでMathJaxが使えるといいな…と思ってるんですがどうもうまく行きません.

 

 

【iPhoneショートカット】二次、三次方程式の実数解の個数を求めるレシピ【スツルムの定理】

f:id:thetheorier:20210116085025p:plain

 先日は三次方程式のみだったので二次方程式も追加しました.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS14.3

 

 

スポンサーリンク

 

 

 

ダウンロード

routinehub.co

 

 

使い方

f:id:thetheorier:20210116085204p:plain

 使い方は前回と概ね変わりませんが二次方程式の項目が増えたこと, そしてRoutineHubにも投稿したため英語での説明が増えています.

 

 

f:id:thetheorier:20210116085336p:plain

 各係数と定数項の値を入力し, 開区間を指定することで…

 

 

f:id:thetheorier:20210116085433p:plain

 指定した方程式の, 指定した開区間における実数解を返します.

 

 

f:id:thetheorier:20210116085534p:plain

 今回は二次方程式を追加した他に, 係数が単数(1や-1), ないし0であったときの体裁を整えた状態で結果を表示するよう変更してあります.

 

 そのため見やすくはなりましたがアクション数がかなり増えています(処理にもたつきを感じることはあまりありません).

 

 

 ある程度チェックはしていますが, 「計算式」アクションの精度に問題があるのかは不明ですが特定の条件で正しい数にならないことがまれにあり, それがなかなか解決せず前回からかなり時間が経ってしまったためとりあえず投稿だけ.

 

 デバッグに Wolfram Alphaを使っているのはなんともですが, スツルムの定理を読めば分かる通り, ある程度の数を熟すには手計算ではかなりの時間がかかります.

 係数が大きくなったり小数だったりすればなおさらです.

 

 ショートカットに限った話ではありませんが, こういう類は全体だけを表示するものでなく, 一部のテクニックやアイデアが他に使えることもしばしばです.

 実際にフローを見て使えるものは大いに使ってください.

 

 

【iPhoneショートカット】区分求積法による積分

f:id:thetheorier:20201021152025p:plain

 それなりの分割数になるとショートカット向けじゃないのが相変わらずです.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS14.1

 

 

スポンサーリンク

 

 

 

区分求積法とは

 簡単に言えば, 定積分を求めるもっとも原始的な考えの一つです.

 区間をいくつかに分け, 分割した区間の左端・中央・右端のいずれかを選択し, その点における値と分割した区間の長方形を計算し積算する方法です.

 分割数が増えれば増えるほど定積分に近づくわけですね.

 

 今回は分割した区間の左端で作られた長方形の面積を計算することにします.

 

 

ダウンロード・使い方

https://www.icloud.com/shortcuts/4d0fb9ac337e4302b9937024ea207c9c

 

 

f:id:thetheorier:20201021152605p:plain

 フォームはいつもと同じようなものです.

 定積分したいxによる数式を書き込み, 次に区間を","で区切って指定, 最後に分割数を決定します.

 下のフローで説明しますが, フローの始めにある「辞書」アクションのブール値を変更することで「繰り返す」アクションの進捗通知のオンオフを予め指定できます(デフォルトは真→通知する).

 

 

フロー

f:id:thetheorier:20201021152841p:plain

 先に書いた通り, このレシピでは「繰り返す」アクションの処理の長さに配慮して以前紹介した進捗通知を組み込んでいます.

 

 

blog.thetheorier.com

  不要な場合はこの「辞書」アクションの「進捗」キーの値をタップして「偽」に変更した上で使用してください.

 

 

f:id:thetheorier:20201021153203p:plain

 続いて数式や区間, 分割数を要求し, 細分した長さΔも計算しておきます.

 

 

f:id:thetheorier:20201021153519p:plain

 積分した結果を入れる変数value(初期値0)と分割した長方形の左端のx座標であるx_k(初期値は積分区間の左端), 進捗通知用の変数tmp(初期値1)も用意しておきます.

 

 

f:id:thetheorier:20201021153721p:plain

 そして分割数だけ, 長方形の面積を足し合わせていきます.

 長方形の横の長さはすべて共通でΔ, 縦の長さはf(x_k)ですね.

 計算しvalueに足し合わせたらx_kにΔだけ足して繰り返しに戻ります.

 

 

f:id:thetheorier:20201021153959p:plain

 最後に好きな体裁で表示します.

 

 

f:id:thetheorier:20201021154058p:plain

 分割数1万で円周率もそこそこの精度で計算してくれます.

 もちろんそこそこ待たされますけどね…

 

 

【iPhoneショートカット】三次方程式の実数解の個数を求めるレシピ【スツルムの定理】

f:id:thetheorier:20201010155658p:plain

 以前作ったとはいえ, 作り直すのは骨が折れます.

 今回は三次方程式のみ.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS14.0.1

 

 

スポンサーリンク

 

 

 

ダウンロード・使い方

 

https://www.icloud.com/shortcuts/e3bf8abce9a54c5692ff48902c5ed426

 

 

f:id:thetheorier:20201010155846p:plain

 まず三次関数の各係数と定数項を入力します.

 今回係数入力などは別々で打つようにしました, 三次関数なので三次の係数は0以外で.

 その後開区間を","で区切って指定します.

 

 

f:id:thetheorier:20201010160117p:plain

 これで指定した開区間の中に実数解が何個あるのか計算してくれます.

 

 

blog.thetheorier.com

  前回作ったものよりかなり速いかも?

 

 

フローの簡単な説明

 基本的な流れは前回と同じで, 数処理が「計算式」アクションによってアクション数が劇的に減ったこと, またショートカットのために, 得られたスツルム列を-1,0,1のいづれかに揃える手法は前回同様用いています.

 

 

 今回は「結果を表示」で三次関数の表示をそれなりにキレイにしてあります.

 係数が0の項は書かないとか1のときは係数をかかないとか全部やりたいんですがそうなるとアクションがいくらでも増えていくので後者はやめときました.

 

 前回と比べアクション数が増えているのは多分このせい.

 

 

f:id:thetheorier:20201010160624p:plain

 画像はスツルム列の1つ目(f0xとでも書きましょうか)の計算式です.

 以前から指摘していますが「計算式」で下手に変数を使うと意図しない扱いを受けるため, 影響する場所は全部括弧で括っています.

 本来の計算なら計算して終わり…ですが, 定理はこのあとで前後と比較して符号が変わったかどうかを見ないといけません.

 逆に言えば符号の変化を見るだけなので計算した値が結果に応じて-1,0,1のどれかであれば良いのです, つまり

 

  • スツルム列のある値が正 → 1
  • スツルム列のある値が0 → 0
  • スツルム列のある値が負 → -1

 

となるように均します.

 そのために, 値が0でない場合に自分自身の絶対値で割っているわけです.

 

 

 今回は三次関数なのでスツルム列が4つ, 区間2つ分なので4×2=8回, (各々で違いますが)似たようなことをします.

 

 

f:id:thetheorier:20201010161656p:plain

  スツルム列f1, つまりfを微分した式の計算式がこちら.

 

 

f:id:thetheorier:20201010161753p:plain

  スツルム列f2, つまりgcd(f0,f1)の計算式がこちら.

 どんどん式が複雑になります.

 

 最後にf3…と言いたいのですがこれだけは他と性質が異なります.

 画像では見づらいですが, f0およびf1は多項式からなる数式です.

 f2は有理多項式, つまり多項式分の多項式…の形になっていますが分母に相当するのは9a, 9はともかくaは三次関数としたので0ではありえません(フローでも最初に弾いてあります).

 なのでそのまま「計算式」でちゃんと評価してくれます.

 

 

f:id:thetheorier:20201010162140p:plain

 問題なのはf3です.

 こちらは(数式が長いのは察しの通りとして)ちょっと画像では見づらいですが分母が

 

(c-b^2)^2

 

…となっています.

 つまり係数の条件次第, 具体的には c-b^2 が0となる場合この計算式は0で割ることになるので計算式アクションは評価してくれません(というより計算できません).

 これをDで置いていることから分かる通り, 判別式のような存在ですね.

 

 なのでその場合は今回は定理の仕様を利用して0の扱いとします.

 そうでない場合は定理に従って計算し, これを均します.

 また定理の条件から, f2,f3は結果に-1をかけます.

 

 

 四次五次…となったらとてもこの手法では厳しいですね, 素直に途中で変数を噛ませないと無用なミスを増やすだけです.

 

 

【iPhoneショートカット】最大公約数を求めるレシピ(iOS14改善版)

f:id:thetheorier:20201008104634p:plain

 「計算式」アクションの登場で数計算関連のレシピの多くの改善が見込めます.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS14.0.1

 

 

スポンサーリンク

 

 

 

ダウンロード・使い方

 

https://www.icloud.com/shortcuts/822a4180d497452e9125e75afa9c7798

 

 

 最初の「入力を要求」にも書いてありますが, 2数の表記は例えば17,19のように","で区切って入力します.

 2数を分けて入力させるのが面倒だったというだけです.

 

 

フロー

f:id:thetheorier:20201008105340p:plain

 上でも書いた通り, a,bという形で2数を入力させ, ","で分割して各々の数を取得します.

 

 

f:id:thetheorier:20201008105437p:plain

 上で定義した変数a,bは表示のために使うので, 演算用にそれぞれx,yの変数に置き, 更に演算効率のためにx>yとなるようにします.

 

 

f:id:thetheorier:20201008105618p:plain

 ここから実際の処理を行います.

 処理はユークリッドの互除法を利用しています, そのため繰り返し回数nは

 

 n\leq 1+\frac{\log{y}}{\log{\varphi}}

 

 を満たします, なのでこれを更にfloorで小数点を切り捨てて繰り返し回数としています.

 

 もしfmod(x,y)=0ならばyがxの約数なのでgcd(x,y)=yであることは確定です.

 そうでなく, かつ1余るなら2数は互いに素なのでgcd(x,y)=1であることが確定します.

 上記のどちらでもなかった場合は, xをyに代入し, yをfmod(x,y)の値に上書きして繰り返しに戻ります.

 

 

実行

f:id:thetheorier:20201008111400p:plain

 これで結果が正しければOKですね.

 

 

f:id:thetheorier:20201008111446p:plain

 普通では扱わないような大きな数でも待たされることなく素早く結果を返してくれます.

 

 

 原始言語からの脱却で数処理の速度がかなりよくなりました.

 他のレシピも追々修正予定です.

 

 

【数学】なるべく少ない計算量で指数表をつくる【原始根・指数】

f:id:thetheorier:20200319115143p:plain

 指数表を作るためには, { \displaystyle a^b }という形の数をひたすら法で整除しなければなりません.

 なのでその作業をできるだけ減らしたい, それが今回の目的です.

 

 

スポンサーリンク

 

 

 

指数表作りに必要な定理たち

 原始根および指数表について, 過去にも面白い性質を見つけましたが何だかんだその証明にもたどり着けました.

 未証明が一つありますが既知のもを含め必要なものを紹介しましょう.

 

 なお, 本記事ではpを5以上の素数とします.

 「素数pについて~」とある場合でも2と3は無視します, 定理によってはp=3でも成り立ちます.

 

 

定理1

 素数{ \displaystyle p}とその任意の原始根{ \displaystyle r }について,

{ \displaystyle r^a\ \left( a\in\mathbb{N} \right) }{ \displaystyle p }の原始根

⇔ { \displaystyle \text{gcd}(a,p-1)=1 }

 これは原始根を学ぶ際に触れる既知のものです.

 

 

定理2

 素数{ \displaystyle p}とその任意の原始根{ \displaystyle r }, 自然数{ n\ ( =1,2,\cdots ,p-1 ) }について,

{ \displaystyle \left| \text{Ind}_r\left( n \right)-\text{Ind}_r\left( p-n \right) \right|\ \equiv\ \frac{ p-1 }{ 2 } \pmod {p-1} }

 { \displaystyle n\equiv -p+n\pmod p }ですから,

{ \displaystyle \text{Ind}_rn \equiv \text{Ind}_r(-p+n)\pmod{p-1} \\ \equiv \text{Ind}_r( (-1)(p-n) ) \\ \equiv \text{Ind}_r(-1)+\text{Ind}_r(p-n) \\ \equiv \frac{p-1}{2}+\text{Ind}_r(p-n) }

  によって成り立ちます.

 

 ようは, 指数表の真ん中を軸にした両端の値の差の絶対値を取ったものが必ず{ \displaystyle \frac{p-1}{2} }となります.

 

 

f:id:thetheorier:20200318145236p:plain

 参考までにp=7の場合を見てみます.

 p=7の場合はp-1=6項あるわけですが, その真中である3と4を軸にその両端の差を取り更に絶対値を取るとそれぞれ

|0-3|=3 |2-5|=3, |1-4|=3
|0-3|=3, |4-1|=3, |5-2|=3

とすべて3になっています.

 

 

推論3

 素数{ \displaystyle p}とその任意の原始根{ \displaystyle r,\ r' }について, { \displaystyle \text{Ind}_rn }{ \displaystyle \text{Ind}_{r'}n }の偶奇は一致する

 上で紹介したp=7の指数表を縦に見ると, それぞれの偶奇は全部同じですね.

 少なくともp=37までの指数表については確認しています.

 

 今回の目的で必須ではありません.

 

 

定理4

 素数{ \displaystyle p}とその任意の原始根{ \displaystyle r }について,

{ \displaystyle rr' \equiv 1 \pmod p }

を満たす, { \displaystyle r }と異なる{ \displaystyle p }の原始根{ \displaystyle r' }が存在する

 これは原始根の定義から比較的簡単に導かれます.

 素数{ \displaystyle p }の任意の原始根{ \displaystyle r }はフェルマーの定理より

 

{ \displaystyle r^{p-1}\ \equiv\ 1 \pmod p }

 

を満たします.

 

 { \displaystyle r\neq p }ですから法はそのままに両辺を{ \displaystyle r }で割れるので

 

{ \displaystyle r^{p-2}\ \equiv\ \frac{1}{r}\ \pmod p }

 

, よって{ \displaystyle rx\equiv 1 }の解が{ \displaystyle r' }に相当します.

 { \displaystyle \text{gcd}(r,p)=1 }は原始根の定義より明らかですから, この合同方程式に解が存在することも明らかです.

 

 ではこの{ \displaystyle r^{p-2}\equiv\frac{1}{p} }は原始根なのか…という疑問が生じます.

 しかしこれは定理1より, { \displaystyle \text{gcd}(p-2,p-1)=1 }が明らかであることから簡単に分かります.

 

 今回の定理の例をp=17で見ると, 原始根は3,5,6,7,10,11,12,14の8つですがうまく組み合わせることで

 

{ \displaystyle 3\cdot 6\equiv 5\cdot 7\equiv 10\cdot 12 \equiv 11\cdot 14\equiv 1 }

 

であることが分かります.

 

 ただ肝心の1が原始根でないため, 代数学的には準群(quasi-group)に相当するんでしょうかね.

 乗法可換なのは明らかですから, このような{ \displaystyle r }{ \displaystyle r' }のペアは1対1です.

 素数{ \displaystyle p }に対する原始根の個数は{ \displaystyle \phi(p-1) }であり, かつ3以上の自然数nについて{ \displaystyle \phi(n) }は2を約数に持ちますから, 指数表の項数は偶数, 従って任意の原始根はいづれかのペア{ \displaystyle (r,r') }の一方となり, 即ち原始根による集合はこのペアによって類別されます.

 このペア{ \displaystyle (r,r') }を本記事では「r-set」と呼ぶことにします.

 

 

系5

 素数{ \displaystyle p}に対して,

 { \displaystyle p }の原始根の組{ \displaystyle (r_1,r_2) }がr-set

{ \displaystyle \Leftrightarrow\quad r_1^{p-2}\equiv r_2 \pmod p }

{ \displaystyle \Leftrightarrow\quad r_2^{p-2}\equiv r_2 \pmod p }

{ \displaystyle \Leftrightarrow\quad r_2 }{ \displaystyle r_1x\equiv 1\pmod p }の解

{ \displaystyle \Leftrightarrow\quad r_1 }{ \displaystyle r_x\equiv 1\pmod p }の解

 定理4を整理しただけです.

 仮に原始根の値が小さくても{ \displaystyle r_1^{p-2} }を整除するのは面倒ですから2つ目は計算を前提とすると必要のないものです.

 

 

定理6

 素数{ \displaystyle p}の任意のr-set { \displaystyle (r_1,r_2) }, 自然数{ \displaystyle n(=1,2,\cdots ,p-1) }について,

{ \displaystyle \text{Ind}_{r_1}n+\text{Ind}_{r_2}n\ \equiv\ 0\ \pmod {p-1} }

 指数についての定理

{ \displaystyle \text{Ind}_{r'}n\ =\ \text{Ind}_{r'}r\text{Ind}_rn }

より,

{ \displaystyle \text{Ind}_{r_2}n\ \\ \equiv\ \text{Ind}_{r_2}r_1\text{Ind}_{r_1}n \\ \equiv \text{Ind}_{r_2}r_2^{-1}\text{Ind}_{r_1}n \quad (*) \\ \equiv\ (-1)\text{Ind}_{r_2}r_2\text{Ind}_{r_1}n \\ \equiv\ -\text{Ind}_{r_1}n }

, よって{ \displaystyle \text{Ind}_{r_1}n+\text{Ind}_{r_2}n\equiv 0 }.

 指数{ \displaystyle \text{Ind} }は法{ \displaystyle p-1 }において合同関係にあるため, { \displaystyle \text{Ind}_{r_1}n+\text{Ind}_{r_2}n\equiv 0\pmod {p-1} }となります.

 また(*)はr-setの定義より{ \displaystyle r_1r_2\equiv 1\pmod p }より{ \displaystyle r_1\equiv r_2^{-1}\pmod p }が成り立つことを利用しています.

 

 

 定理2は固定の原始根に基づく「横の関係」でしたが, こちらは固定の自然数に対する「縦の関係」です.

 

f:id:thetheorier:20200318155833p:plain

 画像のように, r-set同士の値を足し合わせると, { \displaystyle p-1 }と合同になります.

 

 

 準備は以上です, ここから具体的に指数表を組んでみます.

 

 

 

指数表作り

 大まかな流れとしては, まずひとつでも良いので原始根を見つけ, 残りの原始根は定理1を使います.

 

 続いて定理4の後に書いたように

 

{ \displaystyle rx\ \equiv\ 1\ \pmod p }

 

を解くことでr-setを組みます.

 

 後は容易な累乗を優先して項目を追加し, そのたびに定理2と6を駆使して埋めていきます.

 

 

p=17での例

試しにそれなりの難易度であるp=17でやってみましょう.

 

 

準備

 素数17の原始根は3,5,6,7,10,11,12,14の8つです.

 一つ見つければあとは定理1を使って芋づる式に見つかります.

 { \displaystyle r }が原始根であるためには{ \displaystyle r^{\frac{p-1}{2}}\equiv -1 \pmod p }である必要があるのと, 計算のしやすさから{ \displaystyle 2^8 }{ \displaystyle 3^8 }などがどうなるか試します.

 

 続いてr-setを組みます.

 定理4で紹介したとおり, 法17について

 

{ \displaystyle 3\cdot 6\equiv 5\cdot 7\equiv 11\cdot 14\equiv 1 }

 

ですから, p=17のr-setは(3,6),(5,7),(11,14)の3組です.

 

 

f:id:thetheorier:20200318165446p:plain

 では分かるモノから入れてみます.

 左の背景色はr-set, n=8,9の背景色は表の中央を表しています.

 

 n=1の場合は自明, n=16についても先程の { \displaystyle r^{\frac{p-1}{2}}\equiv 1\pmod p }から, 原始根に関係なく{ \displaystyle \frac{17-1}{2}=8 }であることがわかります.

 また{ \displaystyle \text{Ind}_rr=1 }も自明ですからこれも簡単に埋められます, これによって定理2より{ \displaystyle \text{Ind}_r(17-r)=\frac{17-1}{2}+1=9 }を埋めることもできます.

 

 

f:id:thetheorier:20200319110052p:plain

 値1と9が埋まったので, 定理6より対応するr-setの値も埋めることができます(以降、背景が赤い場所が追加した部分).

 今回はp=17なので, 足して17になるように, r-setの片方の値が定まります.

 累乗の計算なしで埋められるのは, 今回はここまでです.

 

 

f:id:thetheorier:20200319110601p:plain

 仕方ないので2乗の値を計算して埋めていきます.

{ \displaystyle 3^2\equiv 9,\ 5^2\equiv 8,\ 6^2\equiv 2,\ 7^2\equiv15 \\ 10^2\equiv 15,\ 11^2\equiv 2,\ 12^2\equiv 8,\ 14^2\equiv 9 }

なので, 上画像のように値2が埋まります.

 { \displaystyle 10,11,12,14 }はそれぞれ法17について{ \displaystyle -7,-6,-5,-3 }と合同ですからこれも利用します.

 

 

f:id:thetheorier:20200319111222p:plain

 追加した値2に対して, 定理2より値{ \displaystyle 2+\frac{17-1}{2}=10 }を埋めることができます.

 

 

f:id:thetheorier:20200319111505p:plain

  追加した2と10に対して, 定理6より{ \displaystyle (17-1)-2=14 }{ \displaystyle (17-1)-10=6 }が埋まります.

 

 まだ足りないので仕方ないです, 3乗も計算しましょう.

 

 

f:id:thetheorier:20200319112247p:plain

{ \displaystyle 3^3\equiv 10,\ 5^3\equiv 6,\ 6^3\equiv 12,\ 7^3\equiv 3 \\ 10^3\equiv 14,\ 11^3\equiv 5,\ 12^3\equiv 11,\ 14^3\equiv 7 }

より, 上画像のように値3が埋まります.

 

 

f:id:thetheorier:20200319112802p:plain

 追加した値3に対して, 定理2と6より, 値5,11,13を埋めることができます.

 これであとは4と12だけになりました.

 

 

f:id:thetheorier:20200319113419p:plain

 これまでの流れを見て分かった方も居られるでしょうが, あと4ヶ所埋まればすべて埋められます.

 計算のしやすさを考えて3,5,12,14の4乗を計算します.

{ \displaystyle 3^4\equiv 13,\ 5^4\equiv 13,\ 12^4\equiv 13,\ 14^4\equiv 13 }

なので上画像のように埋まります.

 

 

f:id:thetheorier:20200319113814p:plain

 残りはやはり定理2と6を使います.

 これでp=17の指数表が完成しました.

 

 

 定理2と6のお陰で一つ確定するとその縦と横の1つずつが確定するため, 作業効率が格段に減ることとなります.

 すべての累乗を計算する手間を考えれば, 今回の例だと素数17に対して8つの原始根の15乗までを計算するのは面倒ですね, それが4乗の一部までで済むことになるのですから.

 

 本当は指定の原始根に対する指数表を簡単に作りたいというのが目的だったので回り道をしているように思えますが現状はこれが早いですね.

 

 

【数学】指数表に幾何学的特徴を見る(その2)【原始根】

f:id:thetheorier:20200228142644p:plain

 2年以上前に似たような疑問を投げかけて放置したまま今に至りましたが, 解決しないまま新たなネタが持ち上がりました.

 

 

スポンサーリンク

 

 

 

これまで

blog.thetheorier.com

 原始根の定義そのものの話はもう割愛しましょう.

 指数表は簡単に言えば対数表の整数バージョンのようなものです.

 

 例えば素数7の原始根は3,5 の2つ, とりあえず今は3を例に挙げると

 

{ \displaystyle 3^0\equiv 1,\quad\ 3^1\equiv 3,\cdots ,3^5\equiv 5 }

 

より, 素数7, 原始根3の指数表は以下となります.

 

1 2 3 4 5 6
0 2 1 4 5 3

 

 前回はこれを単位円上にプロットすることで

 

 

 例えばこんな図形が得られました.

 

 

blog.thetheorier.com

 あるいは指数表の一部に巡回性が存在することを紹介しました.

 

 今回は前者寄りです.

 

 

二次元平面にプロット

 今回は得られた値を利用して平面に座標表示してみます.

 

 

f:id:thetheorier:20200228152053p:plain 

 やることはさして難しくはありません.

 表の隣り合う値同士を点とみなすだけです.

 よって今回の, 素数7, 原始根3の場合

 

(0,2), (2,1), (1,4), (4,5), (5,3)

 

の5つの点を得ます.

 これらを「表から生成した点」とでも呼ぶことにします.

 

f:id:thetheorier:20200228152428p:plain

 更に表から生成した点同士を, 得た順で両端から繋げていきます.

 今回は (0,2)と(5,3), そして(2,1)と(4,5)を繋げます.

 (1,4)は相方がいないのでプロットだけし, これを「孤立点」と呼ぶことにします.

 指数表の項目数は必ず偶数であり, 素数3を除いて指数表には必ず孤立点が存在します.

 

 

f:id:thetheorier:20200228152700p:plain

 すると画像のようになります.

 簡単に説明すると

 

  • 塗りつぶしありの点 → 表の左側で生成した点
  • 塗りつぶしなしの点 → 表の右側で生成した点
  • 太字で塗りつぶしのない点 → 孤立点

, また生成点同士を繋げた線にある数字はその直線の傾きです.

 意味があるかはまだわかりませんが塗りつぶしのある生成点を始点, 塗りつぶしなしの生成点を終点とみなした時になんらかの特徴を見いだせるかもしれません.

 

 こうして見ると孤立点はともかくとして生成点による直線に線対称を見出すことができそうです.

 

 では他の場合はどうでしょう?

 

 

f:id:thetheorier:20200228154243p:plain

 こちらは素数13, 原始根2の場合です.

 先程見られた線対称性は見られず, 対して傾きが-1の直線が見られます.

 実は素数7までの一部の指数表はその数が小さいのが原因で, この「傾き-1の直線」が最低でも1つ確認できます.

 

 なお, 傾き-1の直線に該当しない各点のうち, x+y≦1, つまり「左下」のある点とそれx+y>1にある点に相似が見られるのでは…とも思ったのですが, この後で紹介しますが例えば素数17, 原始根14で例外があるためそんなに単純な話ではないようです.

 

 ともかく説明はこれまでとして実際に見てもらう方が早いでしょう(というよりこれ以上よく分かっていません).

 

 

各素数・原始根ごとの図表

 以下では素数p, 原始根rにおける, 上記で説明した通りにプロットした図表を紹介します.

 手間の都合で素数19までとなっています.

 

 

p=5

 素数5の原始根は2,3の2個です.

 

f:id:thetheorier:20200228160402p:plain

 

f:id:thetheorier:20200228160456p:plain

 

p=7

 素数7の原始根は3,5の2個です.

 

f:id:thetheorier:20200228160650p:plain

 

f:id:thetheorier:20200228160659p:plain


p=11

 素数11の原始根は2,6,7,8の4個です.

 

f:id:thetheorier:20200228160931p:plain

 

f:id:thetheorier:20200228160941p:plain

 

f:id:thetheorier:20200228160952p:plain

f:id:thetheorier:20200228161001p:plain

 

 

p=13

 素数13の原始根は2,6,7,11の4個です.

 

f:id:thetheorier:20200228161535p:plain

 

f:id:thetheorier:20200228161549p:plain

f:id:thetheorier:20200228161558p:plain

 

f:id:thetheorier:20200228161608p:plain

 

p=17

 素数17の原始根は3,5,6,7,10,11,12,14の8個です.

 

f:id:thetheorier:20200228161852p:plain

 

f:id:thetheorier:20200228161902p:plain

 

f:id:thetheorier:20200228161914p:plain

 

f:id:thetheorier:20200228161926p:plain

 

f:id:thetheorier:20200228161938p:plain

 

f:id:thetheorier:20200228161951p:plain

 

f:id:thetheorier:20200228162006p:plain

 

f:id:thetheorier:20200228162017p:plain

 

p=19

 素数19の原始根は2,3,10,13,14,15の6個です

 

f:id:thetheorier:20200228162353p:plain

 

f:id:thetheorier:20200228162440p:plain

 

f:id:thetheorier:20200228162449p:plain

 

f:id:thetheorier:20200228162502p:plain

 

f:id:thetheorier:20200228162511p:plain

 

f:id:thetheorier:20200228162520p:plain

 

 

 同じ素数同士で互いに線対称や点対称などの関係にあるものがありそうでない, 傾き-1の直線の数も素数と原始根の組と関係があるのかどうか, -1以外の直線はなぜすべて正になるのか, その傾きの値も似たものばかり…

 

 色々と分からないことが多いですね, これまでのと組み合わせて指数表を正攻法で解く以外のヒントになればと色々試しているのですが…

 

 

【ショートカット】一次合同方程式を求めるショートカット

181110_65

 今回は一次合同方程式を求めるショートカットを作ってみました.

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のバージョン : v2.1.1

 

スポンサーリンク

 

 

一次合同方程式の解

 今回, 法は5以上の素数 { \displaystyle p } とします.

 合成数の法はちょっとややこしいですからね.

 

 整数 { \displaystyle a,\,b } と法 { \displaystyle p } による合同方程式

 

{ \displaystyle ax\equiv b\pmod p }

 

は, { \displaystyle \text{gcd}(a,p)=1 } であるときのみただ一つの解を持ちます.

 

 今回も絶対値最小剰余として求めるため, { \displaystyle ab\equiv 1 } なる { \displaystyle b } を { \displaystyle \left[ \frac{p}{2} \right] } から一つずつカウントダウンして探します.

 

 

フロー

181110_66

 まず法の入力を要求し, 素数判定の関数を呼び, 問題なければそれを変数 p として扱います.

 逆数の候補として { \displaystyle \left[ \frac{p}{2} \right] } の結果を変数 a^-1 に置きます.

 

 

181110_67

 続いて x の係数に相当する a を入力させます.

 

 

181110_68

 a および p が互いに素であるかを確認するため, ユークリッドの互除法を計算する関数を呼び出します.

 結果が 1 より大きければ本ショートカットを初めからやり直します.

 

 

181110_69

 { \displaystyle ac\equiv b } の { \displaystyle b } に相当する値の入力を要求すれば準備が整いました.

 あとは a と 逆数候補 a^-1 を掛け合わせ, 法 p で 1 と合同になるかチェックします.

 

 

181110_70

 結果が 1 になるならば変数 a^-1 は a の逆数なので一旦変数 x に代入します.

 1でないならば a^-1 を1つ減らして繰り返しを戻ります.

 

 

181110_71

 得られた a の逆数 a^-1(変数は x) を呼び出し, 変数 b をかけ合わせて法 p で整除すれば求める答えが出てきます.

 

 

実行

181110_72

 3つの数を代入し, 結果が正しいことを確かめます.

 

 

 法の値に応じて繰り返し処理を行っているため, 法の大きさにおよそ比例して処理時間は長くなります.

 

 a, b を予め整除するのを忘れていましたね, それを行えば各々が大きな整数でも高々 { \displaystyle p } 未満の小さな整数に帰着されます.