(クロスアウトされた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
限り、より大きい数で発生する必要があります。より正確には、が互いに素である場合にのみ終了します。P
10
P
10
編集:それは実際に判明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
、P
ifである場合にのみ割り切れるので問題ありません(-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
。左側の絶対値が最小になるまでP
fromの倍数を加算/減算し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
います。