(クロスアウトされた44はまだ44です。)バイトを保存してくれたFireflame241に感謝します!
P=input();i=P/3
while i*10%P-1:i-=1
print i
オンラインでお試しください!
0との間にちょうど1つの数字があり、P-1これはの逆数です10。しかし、その逆uがたまたまより大きい場合P/2、それ(u-P)も逆であり、より小さい絶対値を持ちuます。だから、私たちは本当にユニークな番号を探していることが判明x間-P/2とP/2の逆です10。
上記のコードは(のフロア)から開始しP/2、逆に到達するまで下にステップ実行します。これは、より大きい素数である-P/2限り、より大きい数で発生する必要があります。より正確には、が互いに素である場合にのみ終了します。P10P10
編集:それは実際に判明x間であることが保証されている-P/3とP/3、現在のバージョンはから始まるので、P/3そこからステップダウン。この説明については、「改良された境界」というラベルのセクションを参照してください。
数学的説明
分割可能性テストがなぜ機能したのか、すぐにはわかりませんでした。他の誰かが疑問に思っている場合のために、ここに説明があります。
させるPプライム、より大きくなり10、その最後の桁です、b。かくして
P = 10a + b
ここでa > 0、および0 <= b < 10。実際にはbどちらかである1、3、7、または9、よりプライム大きいため、10これらの数字の1で必須の終わり。
今と仮定bx + a = 0 (mod P)。それから
a = -bx (mod P)
10a + b = 10(-bx) + b (mod P)
0 = 10(-bx) + b (mod P)
0 = b(1 - 10x) (mod P)
のでP素数である、整数がmod Pある一体型ドメイン。したがってb = 0 (mod P)、またはのいずれか1 - 10x = 0 (mod P)です。
私たちは知ってい0 <= b < 10 < Pそうであれば、b = 0 (mod P)それからb = 0。しかし、我々が言ったbのいずれかである1、3、7、または9、そう、これは不可能です。したがって1 - 10x = 0 (mod P)、そう10x = 1 (mod P)。つまり、はのx逆で10、モジュロPです。
ここでN、最後の桁がである非負の整数であると仮定しますd。したがってN = 10c + d. 、同等のステートメントのチェーンがあります。
10c + d = 0 (mod P)
<==> 10xc + dx = 0 (mod P)
<==> c + dx = 0 (mod P)
QED。
使いやすさ?
私はまた、整除テストは(与えられたかどうかを疑問に思ったN = 10c + d、交換するNことでdx + c)実際に、実際に生産的だろう。または、少なくとも(絶対値で)Nより小さい数で確実に置き換えられNますか?
仮定しN = 10c + d、どこc >= 0と0 <= d < 10。したがって10c = N - d <= N。三角形の不等式により、
|c + dx| <= |c| + |dx| = c + d|x| <= N/10 + d|x|
< N/10 + 10|x| <= N/10 + 10P/2 = N/10 + 5P
したがって5P <= 9N/10、その場合|c + dx| < N。
特に、if N >= 6P、then |c + dx| < N。このように、与えられたP我々は計算することから始め2P、3P、...、6Pと一緒に、x。次に与えられたN、私たちは数未満に達するか等しいまで繰り返し整除テストを実行し6P、その結果が数字のいずれかであるかどうかを確認します0、P、2P、...、 6P。
(もちろん、負の数に達するたびに、その絶対値で置き換えます。これはq、Pifである場合にのみ割り切れるので問題ありません(-q)。)
改善されたバウンド
私は|x|/P決して近くには見えないことに気づきました1/2。それは常に未満だったように実際にはそれが見えた1/3...か、綿密に検討すると、それは非常に近いのいずれかに常にでした1/10か3/10。それは今までに得た最大のではと思われた4/13(ときたまたまP=13とx=4)。これはなぜですか?
してみましょうu整数になるとしたとする10u = kP + 1いくつかの整数をk、そうuとは逆の10モジュロ、P。そして、我々はまた、それが知っているkと互いに素である10ことから、k(-P)と等価である1モジュロ10。
これで、10モジュロの逆数はPすべての倍数で異なることがわかっているPので、整数uを取得し、任意の倍数を加算または減算できP、結果は常に10モジュロの逆数になりますP。私たちは減算することを選択したと仮定Pからu:私たちが得ます
10(u - P) = 10u - 10P = kP + 1 - 10P
10(u - P) = (k - 10)P + 1
換言すれば、減少(それぞれ、増加)uによってP(増加)の減少に対応kすることによって10。左側の絶対値が最小になるまでPfromの倍数を加算/減算しuます。しかし、右側が最小化されたときに左側が正確に最小化されるため、右側が絶対値で最小化さ10れるkまで、そこから加算/減算します。
しかし、我々は時にこれが起こるだろうことを知っているkとの間にある-5と5、それゆえ(以降kと互いに素である10)、この手段kのいずれか-3、-1、1、または3。(これはOPの下での@Neilのコメントの内容です。ありがとう、Neil!)
このようにする場合|u|(すなわち、最小化されたu=x)、私たちは持っているだろうx/P = u/P = k/10 + 1/(10P)、どこkのいずれかである-3、-1、1、または3。したがって|x|/P <= 3/10 + 1/(10P)。同様に、|x| <= (3P + 1)/10。
さらに、この不平等は、厳しいP=11であるため、P=11私たちは持っているx=-1とk=-1。P等式が成立する最小値はP=13(where x=4およびk=3)です。
したがって、|x|/Pこれまでに得られる最大のものは3/10 + 1/(10*13)、です。なぜなら、これP=13は最初の素数でありk=3、の中k=3で、1/(10P)項Pは最小のとき(つまりP=13)に最大です。したがって、すべてのためにP、私たちも持ってい|x|/P <= 3/10 + 1/130 = 4/13 < 1/3ます。これは、上記のコードでi = P/3で開始するのではなくで初期化できる理由を説明していP/2ます。
さらに、上記の「有用性」セクションの境界を改善できるようになりました。
補題:N = 10c + dどこにc > 0しましょう0 <= d <= 9。その後c + d|x| < N/10 + 9(3P + 1)/10。(厳密な不等式に注意してください。)
補題の証明:場合によって。ケースI:d = 0のでN = 10c。その後c + d|x| = c = N/10 < N/10 + 9(3P + 1)/10。
ケースII: 0 < d <= 9。それでは10c = N - d < N、そうc < N/10。したがってc + d|x| < N/10 + d|x| <= N/10 + 9|x| <= N/10 + 9(3P + 1)/10。QED。
したがって、N > 3P(N = 10c + d以前と同様に)
3P + 1 <= N
9(3P + 1)/10 <= 9N/10
N/10 + 9(3P + 1)/10 <= N
c + d|x| < N/10 + 9(3P + 1)/10 <= N
だから、もしN > 3P、その後c + d|x| < N。
したがって、我々は唯一見つけなければならないP、2Pと3P一緒に、x。与えられたN > 0一方で、N > 3P我々は交換するNことにより|c + dx|減少します、N。最終的には取得しN <= 3Pます。その時点で、私たちは停止し、かどうかを確認N番号のいずれかに等しい0、P、2P、または3P。
私たちは3P一般よりもうまくやることができません。例えば、仮定P = 13およびN = 39ので、x = 4。そして、交換するNことにより、dx + c = 9(4) + 3葉N変わりません。
x絶対値の最小値を探して10*x-1います。