Dado um primo P
maior que 10
, seu programa ou função deve descobrir sua regra de divisibilidade x
, definida como o número inteiro com o menor valor absoluto, que gera um múltiplo do primo original quando multiplicado pelo último dígito do primo e adicionado ao restante do original. prime.
Exemplo
Dada uma entrada 31
, o último dígito é 1
e o restante do número é 3
. Portanto, seu programa deve encontrar o número inteiro x
com valor absoluto mínimo, de modo que 1*x + 3
seja múltiplo de 31
. Nesse caso, x=-3
funciona, para que o programa ou função retorne -3
.
Dada uma entrada 1000003
, o último dígito é 3
e o restante do número é 100000
. Assim, seu programa encontraria x=300001
porque 3*300001+100000 = 1000003
é um múltiplo de 1000003
.
Formação Matemática
O valor de x
pode ser usado como um teste de divisibilidade. Se um número N
é divisível por P
, a adição de x
vezes o último dígito de N
ao resto de N
produzirá um múltiplo de P
se e somente se N
é divisível por P
em primeiro lugar.
Pois P=11
, entendemos x=-1
, que é equivalente à conhecida regra de divisibilidade para 11
: um número é divisível pela 11
diferença alternada de seus dígitos é divisível por 11
.
Regras
- A saída pode estar em qualquer forma que codifique claramente o sinal e o valor da saída.
- O primo de entrada estará entre 10 e 2 ^ 30.
- Você não precisa manipular se a entrada não for primária ou não estiver no intervalo.
- Você não precisa lidar com se ambos
x
e-x
são saídas válidas (não deve acontecer). - A força bruta é permitida, mas soluções mais criativas são apreciadas.
- Isso é código-golfe , então o código mais curto em cada idioma vence! Não permita que respostas em idiomas de golfe o desencorajem de postar em outros idiomas.
Casos de teste
Input Output
11 -1
13 4
17 -5
19 2
23 7
29 3
31 -3
37 -11
41 -4
43 13
47 -14
53 16
59 6
61 -6
67 -20
71 -7
73 22
79 8
83 25
89 9
97 -29
101 -10
103 31
107 -32
109 11
113 34
127 -38
131 -13
1000003 300001
2000003 600001
2999999 300000
9999991 -999999
fonte
x
valor absoluto, onde10*x-1
é divisível pela entrada.(3 / (n % 5 * 2 - 5) * n + 1) / 10
e(n % 5 * 2 - 5^2) * n / 10 + 1
é capaz de encontrar um valor absoluto mínimo para algo assim? Minha primeira intuição teria sido calcular o múltiplo menos comum usando o maior divisor comum calculado com o algoritmo de Euclides.x
, adicioná-lo e ainda assim obter um número divisível porn
. Se multiplicarmos o novo número por 10 e subtrairmos o número original, ele ainda será divisível porn
. O comentário de xnor segue, então, de alguma álgebra. O próximo passo é reorganizar a fórmula para que ela dêx
em termos den
: x =(k*n+1)/10
. Queremos que o menor absolutox
assim, portanto, nós queremos o menor absolutak
, e isso deve ser qualquer um de-3
,-1
,1
ou3
(dependendon
do último dígito), que faz a divisão exata.Respostas:
JavaScript (ES6),
322523 bytes3/(n%5*2-5)
seria escrito9/n(mod -10)
se eu tivesse acesso à divisão de módulos equilibrada. Edit: Salvo 2 bytes graças a @EgorSkriptunofffonte
n=>((n%10*2%14-3)*n+1)/10
porn=>(3/(n%5*2-5)*n+1)/10
Python 2 , 27 bytes
Experimente online!
As operações são feitas esquerda para a direita:
(((n%5)*2)-5)^2
.Eu usei meu forcador bruto aritmético para encontrar a expressão
n%5*2-5^2
para executar{1:-1,3:3,2:-3,4:1}[k]
, levando o inverso negativo de um resíduo mod 5 para o intervalo[-2..2]
.fonte
3/(n%5*2-5)
É o mesmo comprimento(n%5*2-5^2)
.)n%5*2-6^3
. Eu olhei apenas para o comprimento da expressão sem parênteses, enquanto3/(n%5*2-5)
dois caracteres são mais longos, mas economizamos nos parênteses externos devido à precedência. Pesquisando expressões desse tamanho deve demorar um pouco. Esse caso de uso sugere uma opção para encontrar apenas expressões que podem ser usadas em um determinado contexto por meio de sua operação mais externa, com precedência suficientemente alta.Gelatina ,
108 bytesExperimente online!
Explicações
fonte
Braquilog , 14 bytes
Experimente online!
fonte
Python 2 ,
695453 bytesEdit: -15 bytes graças a @ Mr.Xcoder
Edit: -1 byte usando recursão
Experimente online!
fonte
Python 2 ,
31 2927 bytesExperimente online!
fonte
Japonês ,
169 bytesSalvo muitos bytes graças a uma observação de @xnor
Teste online! Pode demorar alguns segundos em entradas maiores.
Explicação
fonte
Java 8,
2321 bytesPorta da resposta JavaScrip (ES6) do @Neil , mas -2 bytes graças ao @Nevay devido ao revestimento implícito de números inteiros.
Experimente aqui.
fonte
n->3/(n%5*2-5)*++n/10
Pyke , 12 bytes
Experimente aqui!
fonte
Pyth , 14 bytes
Experimente aqui.
fonte
Python 2 ,
4443 bytes( Riscado 44 ainda é 44.) Obrigado a Fireflame241 por salvar um byte!
Experimente online!
Existe exatamente um número entre
0
e doP-1
qual é inverso10
. Mas se esse inversou
for maior queP/2
, então(u-P)
também será um inverso e terá um valor absoluto menor queu
. Assim, verifica-se que estamos realmente olhando para o número únicox
entre-P/2
eP/2
que é o inverso da10
.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 queP
é um primo maior que10
. Mais precisamente, ele terminará se e somente seP
for coprime para10
.Editar: Na verdade,
x
é garantido que está entre-P/3
eP/3
, portanto, a versão atual começa emP/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 que10
, cujo último dígito éb
. portantoP = 10a + b
em que
a > 0
, e0 <= b < 10
. Na verdadeb
é tanto1
,3
,7
ou9
, porque uma maior nobre do que10
final must em um desses dígitos.Agora suponha
bx + a = 0 (mod P)
. Entãoa = -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 inteirosmod P
são um domínio integral . Entãob = 0 (mod P)
, ou1 - 10x = 0 (mod P)
.Nós sabemos
0 <= b < 10 < P
, então seb = 0 (mod P)
entãob = 0
. Mas nós dissemosb
é ou1
,3
,7
ou9
, então isso é impossível. Portanto1 - 10x = 0 (mod P)
, então10x = 1 (mod P)
. Em outras palavras,x
é o inverso do10
móduloP
.Agora, suponha que
N
seja um número inteiro não negativo cujo último dígito sejad
, 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ídoN
pordx + c
) seria realmente produtivo na prática. Ou pelo menos, ele substitui com segurançaN
por um número menor queN
(em valor absoluto)?Suponha
N = 10c + d
, ondec >= 0
e0 <= d < 10
. Portanto10c = 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, dadoP
que começamos calculando2P
,3P
, ...,6P
, juntamente comx
. Então dadoN
, corremos o teste de divisibilidade repetidamente até chegar a um número menor ou igual a6P
, e verificar se o resultado é qualquer um dos números0
,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 porP
se e somente se(-q)
é.)Limite melhorado
Percebi que
|x|/P
nunca parecia estar perto1/2
. Na verdade, parecia que sempre foi menos do que1/3
... ou após um exame mais detalhado, sempre foi muito próximo de um1/10
ou outro3/10
. A maior já parecia ser4/13
(o que acontece quandoP=13
ex=4
). Por que isso seria?Seja
u
um número inteiro e suponha que,10u = kP + 1
para algum número inteirok
, ou
inverso seja o10
móduloP
. Então também sabemos que issok
é relativamente primordial10
, já quek(-P)
é equivalente a1
módulo10
.Agora, sabemos que todos os inversos do
10
móduloP
diferem por múltiplos deP
, para que possamos pegar o número inteirou
e adicionar ou subtrair múltiplosP
à vontade, e o resultado sempre será um inverso do10
móduloP
. Suponha que nós escolhemos para subtrairP
a partir deu
: obtemos10(u - P) = 10u - 10P = kP + 1 - 10P
10(u - P) = (k - 10)P + 1
Em outras palavras, diminuir (respectivamente, aumentar)
u
emP
corresponde a diminuir (aumentar)k
em10
. Queremos adicionar / múltiplos subtrair deP
partiru
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 / subtrair10
dek
até que o lado direito seja minimizado em valor absoluto.Mas nós sabemos que isso vai acontecer quando
k
estiver entre-5
e5
, e, portanto, (uma vez quek
é relativamente privilegiada para10
) este meiok
é ou-3
,-1
,1
ou3
. (Este é o conteúdo do comentário de @ Neil no OP. Obrigado, Neil! )Assim, quando
|u|
é minimizado (ou seja,u=x
), teremosx/P = u/P = k/10 + 1/(10P)
, ondek
é ou-3
,-1
,1
ou3
. Portanto|x|/P <= 3/10 + 1/(10P)
. Equivalentemente|x| <= (3P + 1)/10
.Além disso, essa desigualdade é estrita em
P=11
, porque emP=11
nós temosx=-1
ek=-1
. O menorP
para o qual a igualdade é válidaP=13
(ondex=4
ek=3
).Portanto, o maior que
|x|/P
já existe é3/10 + 1/(10*13)
, porqueP=13
é o primeiro primo para o qual temosk=3
e, entre aqueles comk=3
, o1/(10P)
termo é maior quandoP
menor (ou seja, emP=13
). Portanto, para todosP
, também temos|x|/P <= 3/10 + 1/130 = 4/13 < 1/3
. Isso explica por que, no código acima, podemos inicializar emi = 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
ondec > 0
e0 <= 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ãoN = 10c
. Entãoc + d|x| = c = N/10 < N/10 + 9(3P + 1)/10
.Caso II:
0 < d <= 9
. Então10c = N - d < N
simc < N/10
. Portantoc + d|x| < N/10 + d|x| <= N/10 + 9|x| <= N/10 + 9(3P + 1)/10
. QED.Assim, se
N > 3P
(eN = 10c + d
como antes), então3P + 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ãoc + d|x| < N
.Portanto, só temos de encontrar
P
,2P
e3P
, juntamente comx
. DadoN > 0
, enquantoN > 3P
, substituímosN
por|c + dx|
, o que diminuiN
. Eventualmente nós chegaremosN <= 3P
; Nesse ponto, parar e verificar seN
é igual a qualquer um dos números0
,P
,2P
, ou3P
.Não podemos fazer melhor do que
3P
em geral. Por exemplo, suponhaP = 13
eN = 39
, entãox = 4
. Em seguida, substituindoN
pordx + c = 9(4) + 3
folhasN
inalteradas.fonte
-1
fora do parênteses: 43 bytesEspaço em branco , 92 bytes
Observe que a sintaxe desse idioma consiste apenas em espaço em branco ; portanto, cada caractere de espaço em branco foi prefixado aqui com S, T ou L (correspondente a Espaço, Tab e Alimentação de linha, respectivamente). Eles podem ser removidos sem perder a funcionalidade, mas são incluídos aqui para serem exibidos corretamente.
Experimente online!
fonte
Japonês , 14 bytes
Inspirado pela solução de Neil .
Teste online!
Explicação:
fonte
Pyke , 10 bytes
Experimente aqui!
fonte
Excel, 27 bytes
Pode ser inserido na célula como
para 25 bytes, mas as atualizações automáticas do Excel.
fonte