( Riscado 44 ainda é 44.) Obrigado a Fireflame241 por salvar um byte!
P=input();i=P/3
while i*10%P-1:i-=1
print i
Experimente online!
Existe exatamente um número entre 0
e do P-1
qual é inverso 10
. Mas se esse inverso u
for maior que P/2
, então (u-P)
também será um inverso e terá um valor absoluto menor que u
. Assim, verifica-se que estamos realmente olhando para o número único x
entre -P/2
e P/2
que é o inverso da 10
.
O código acima faz exatamente isso, começando em (o andar de) P/2
e descendo até que um inverso seja alcançado. Isso deve acontecer para um número maior que -P/2
o tempo que P
é um primo maior que 10
. Mais precisamente, ele terminará se e somente se P
for coprime para 10
.
Editar: Na verdade, x
é garantido que está entre -P/3
e P/3
, portanto, a versão atual começa em P/3
e desce a partir daí. Consulte a seção Limite aprimorado para obter uma explicação sobre isso.
Explicação matemática
Não ficou imediatamente óbvio para mim por que o teste de divisibilidade funcionou. Aqui está uma explicação, caso alguém mais esteja se perguntando.
Deixei P
Ser um primo, maior que 10
, cujo último dígito é b
. portanto
P = 10a + b
em que a > 0
, e 0 <= b < 10
. Na verdade b
é tanto 1
,3
, 7
ou 9
, porque uma maior nobre do que10
final must em um desses dígitos.
Agora suponha bx + a = 0 (mod P)
. Então
a = -bx (mod P)
10a + b = 10(-bx) + b (mod P)
0 = 10(-bx) + b (mod P)
0 = b(1 - 10x) (mod P)
Como P
é primo, os números inteiros mod P
são um domínio integral . Então b = 0 (mod P)
, ou1 - 10x = 0 (mod P)
.
Nós sabemos 0 <= b < 10 < P
, então se b = 0 (mod P)
então b = 0
. Mas nós dissemos b
é ou 1
, 3
, 7
ou 9
, então isso é impossível. Portanto 1 - 10x = 0 (mod P)
, então10x = 1 (mod P)
. Em outras palavras, x
é o inverso do 10
módulo P
.
Agora, suponha que N
seja um número inteiro não negativo cujo último dígito seja d
, portanto, N = 10c + d.
temos uma cadeia de instruções equivalentes:
10c + d = 0 (mod P)
<==> 10xc + dx = 0 (mod P)
<==> c + dx = 0 (mod P)
QED.
Utilidade?
Também estava me perguntando se o teste de divisibilidade (dado N = 10c + d
, substituído N
por dx + c
) seria realmente produtivo na prática. Ou pelo menos, ele substitui com segurança N
por um número menor que N
(em valor absoluto)?
Suponha N = 10c + d
, onde c >= 0
e 0 <= d < 10
. Portanto 10c = N - d <= N
. Pela desigualdade do triângulo,
|c + dx| <= |c| + |dx| = c + d|x| <= N/10 + d|x|
< N/10 + 10|x| <= N/10 + 10P/2 = N/10 + 5P
Assim se 5P <= 9N/10
, então |c + dx| < N
.
Em particular, se N >= 6P
, então |c + dx| < N
. Assim, dado P
que começamos calculando 2P
, 3P
, ..., 6P
, juntamente com x
. Então dado N
, corremos o teste de divisibilidade repetidamente até chegar a um número menor ou igual a 6P
, e verificar se o resultado é qualquer um dos números 0
, P
, 2P
, ..., 6P
.
(Obviamente, sempre que atingimos um número negativo, o substituímos por seu valor absoluto, o que é bom, pois q
é divisível por P
se e somente se(-q)
é.)
Limite melhorado
Percebi que |x|/P
nunca parecia estar perto 1/2
. Na verdade, parecia que sempre foi menos do que 1/3
... ou após um exame mais detalhado, sempre foi muito próximo de um 1/10
ou outro 3/10
. A maior já parecia ser 4/13
(o que acontece quando P=13
e x=4
). Por que isso seria?
Seja u
um número inteiro e suponha que, 10u = kP + 1
para algum número inteiro k
, o u
inverso seja o 10
módulo P
. Então também sabemos que isso k
é relativamente primordial 10
, já que k(-P)
é equivalente a 1
módulo 10
.
Agora, sabemos que todos os inversos do 10
módulo P
diferem por múltiplos de P
, para que possamos pegar o número inteiro u
e adicionar ou subtrair múltiplos P
à vontade, e o resultado sempre será um inverso do 10
módulo P
. Suponha que nós escolhemos para subtrair P
a partir de u
: obtemos
10(u - P) = 10u - 10P = kP + 1 - 10P
10(u - P) = (k - 10)P + 1
Em outras palavras, diminuir (respectivamente, aumentar) u
em P
corresponde a diminuir (aumentar) k
em 10
. Queremos adicionar / múltiplos subtrair de P
partir u
até que o lado esquerdo é minimizado em valor absoluto; mas o lado esquerdo é minimizado exatamente quando o lado direito é minimizado e, por isso, queremos adicionar / subtrair 10
dek
até que o lado direito seja minimizado em valor absoluto.
Mas nós sabemos que isso vai acontecer quando k
estiver entre -5
e 5
, e, portanto, (uma vez que k
é relativamente privilegiada para 10
) este meio k
é ou -3
, -1
, 1
ou 3
. (Este é o conteúdo do comentário de @ Neil no OP. Obrigado, Neil! )
Assim, quando |u|
é minimizado (ou seja, u=x
), teremos x/P = u/P = k/10 + 1/(10P)
, onde k
é ou -3
, -1
, 1
ou 3
. Portanto |x|/P <= 3/10 + 1/(10P)
. Equivalentemente |x| <= (3P + 1)/10
.
Além disso, essa desigualdade é estrita em P=11
, porque em P=11
nós temos x=-1
e k=-1
. O menor P
para o qual a igualdade é válida P=13
(onde x=4
e k=3
).
Portanto, o maior que |x|/P
já existe é 3/10 + 1/(10*13)
, porque P=13
é o primeiro primo para o qual temos k=3
e, entre aqueles com k=3
, o 1/(10P)
termo é maior quando P
menor (ou seja, em P=13
). Portanto, para todos P
, também temos |x|/P <= 3/10 + 1/130 = 4/13 < 1/3
. Isso explica por que, no código acima, podemos inicializar em i = P/3
vez de precisar começar emP/2
.
Além disso, os limites na seção Utilidade acima agora podem ser aprimorados.
Lema : Deixe N = 10c + d
onde c > 0
e 0 <= d <= 9
. Entãoc + d|x| < N/10 + 9(3P + 1)/10
. (Observe a desigualdade estrita.)
Prova de lema: por casos. Caso I:, d = 0
então N = 10c
. Entãoc + d|x| = c = N/10 < N/10 + 9(3P + 1)/10
.
Caso II: 0 < d <= 9
. Então 10c = N - d < N
sim c < N/10
. Portantoc + d|x| < N/10 + d|x| <= N/10 + 9|x| <= N/10 + 9(3P + 1)/10
. QED.
Assim, se N > 3P
(e N = 10c + d
como antes), então
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
Então, se N > 3P
então c + d|x| < N
.
Portanto, só temos de encontrar P
, 2P
e 3P
, juntamente com x
. Dado N > 0
, enquanto N > 3P
, substituímos N
por |c + dx|
, o que diminui N
. Eventualmente nós chegaremos N <= 3P
; Nesse ponto, parar e verificar se N
é igual a qualquer um dos números 0
, P
, 2P
, ou 3P
.
Não podemos fazer melhor do que 3P
em geral. Por exemplo, suponha P = 13
e N = 39
, então x = 4
. Em seguida, substituindo N
por dx + c = 9(4) + 3
folhas N
inalteradas.
x
valor absoluto, onde10*x-1
é divisível pela entrada.