1000003으로 나눌 수 있습니까? 마지막 숫자에 300001을 곱하고 더하기 만하면됩니다!


16

P보다 큰 소수가 주어지면 10, 프로그램이나 함수는 그것의 분할 규칙을 알아 내야하며 x, 절대 값이 가장 작은 정수로 정의 되어야합니다 . 소수의 소수는 소수의 마지막 자릿수를 곱하고 원래의 나머지에 추가 될 때 원래 소수의 배수를 산출합니다. 초기.

입력이 주어지면 31마지막 숫자는 1나머지 숫자는 3입니다. 따라서 프로그램이 정수 찾아야 x등 최소 절대 값 1*x + 3의 배수입니다 31. 이 경우 x=-3작동하므로 프로그램이나 함수가을 반환 -3합니다.

입력이 주어지면 1000003마지막 숫자는 3나머지 숫자는 100000입니다. 따라서 귀하의 프로그램 은의 배수 x=300001이기 때문에 찾을 것 3*300001+100000 = 1000003입니다 1000003.

수학적 배경

의 값은 x나누기 테스트로 사용할 수 있습니다. 숫자 N를로 나눌 수있는 경우 마지막 자리의 나머지 숫자에 시간 P을 더하면 처음에 나눌 수있는 경우에만 배수가 됩니다 .xNNPNP

를 들어 P=11, 우리는 얻을 x=-1에 대한 잘 알려진 가분성 규칙에 해당하는 11숫자로 나누어 : 11그 자리의 교류 차이로 나누어 11.

규칙

  • 출력은 부호 및 출력 값을 명확하게 인코딩하는 임의의 형태 일 수있다.
  • 입력 프라임은 10에서 2 ^ 30 사이입니다.
  • 입력이 소수가 아니거나 범위에 있지 않은 경우 처리 할 필요가 없습니다.
  • 당신은 핸들에 필요하지 않은 경우 모두 x-x 유효 출력 (발생해서는 안)입니다.
  • 무차별 대입은 허용되지만보다 창의적인 솔루션이 필요합니다.
  • 이것은 이므로 각 언어에서 가장 짧은 코드 승리합니다! 골프 언어로 된 답변이 다른 언어로 게시하는 것을 방해하지 않도록하십시오.

테스트 사례

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

3
유용한 단순화 : 입력으로 나눌 수 있는 가장 작은 x절대 값을 찾고 10*x-1있습니다.
xnor

아무도 힌트 이유를 제공 할 수 (3 / (n % 5 * 2 - 5) * n + 1) / 10(n % 5 * 2 - 5^2) * n / 10 + 1같은 것을위한 최소한의 절대 값을 찾을 수 있습니까? 첫 번째 직감은 Euclid의 알고리즘으로 계산 된 최대 공약수를 사용하여 최소 공배수를 계산하는 것이 었습니다.
David Foerster

1
@DavidFoerster 숫자가 주어지면 마지막 숫자를 제거하고 숫자를 곱한 다음 숫자를 더한 다음 x숫자를로 나눌 수 n있습니다. 새 숫자에 10을 곱하고 원래 숫자를 빼면 여전히 나눌 수 n있습니다. xnor의 의견은 대수학에서 나옵니다. 이 부여되도록 다음 단계는 수식을 재정렬하는 x관점에서 n, X = (k*n+1)/10. 우리는 작은 절대 원하는 x그래서 그러므로 우리는 작은 절대 싶어 k하고,이 중 어느 하나 여야합니다 -3, -1, 1또는 3(에 따라 n정확한 분할을 만드는의 마지막 자리).
Neil

답변:


14

자바 스크립트 (ES6), 32 25 23 바이트

f=
n=>(3/(n%5*2-5)*n+1)/10
<input type=number min=1 oninput=o.textContent=this.value%5*(this.value%2)?f(this.value):``><pre id=o>

3/(n%5*2-5)9/n(mod -10)균형 모듈로 분할에 액세스 할 수 있다면 쓰여질 것 입니다. 편집 : @ EgorSkriptunoff 덕분에 2 바이트를 절약했습니다.


3
n=>((n%10*2%14-3)*n+1)/10n=>(3/(n%5*2-5)*n+1)/10
Egor Skriptunoff


@KevinCruijssen 아마도 Java 8을위한 거의 다량의 폴리 글로 트일 것입니다.
Neil

@Neil 당신이 맞아요. 나는 보통 Java 답변을 게시하므로 귀하의 답변을 볼 때 이미 xnor 포트에서 작업하고 있었습니다 . 당신을 지루한 지루한 포트로 어느 쪽이든 게시했습니다.
Kevin Cruijssen

8

파이썬 2 , 27 바이트

lambda n:(n%5*2-5^2)*n/10+1

온라인으로 사용해보십시오!

작업은 왼쪽에서 오른쪽으로 수행됩니다. (((n%5)*2)-5)^2 .

나는 잔인한 모드 5의 음의 역수를 범위로 가져 가서, 산술적 인 무차별 대담을 사용 n%5*2-5^2하여 수행 할 표현을 찾았다 .{1:-1,3:3,2:-3,4:1}[k][-2..2]


이 산술 무차별 대행사가 어딘가에 공개적으로 이용 가능합니까?
Lynn

그것이 발견 된 유일한 표현입니까 아니면 주어진 길이의 첫 번째 표현을 인쇄합니까? ( 3/(n%5*2-5)와 같은 길이 (n%5*2-5^2)입니다.)
Neil

@Lynn 아니요, 시간이 있으면 청소하고 게시하여 게시 할 수 있습니다.
xnor

1
@Neil 해당 항목 만 발견했습니다 n%5*2-6^3. 나는 parens가없는 표현식을 통해 길이를 찾았지만 3/(n%5*2-5)두 문자는 더 길지만 우선 순위로 인해 외부 parens를 절약합니다. 이 길이의 표현식을 검색하려면 시간이 걸립니다. 이 유스 케이스는 우선 순위가 높은 가장 바깥 조작을 통해 주어진 컨텍스트에서 사용할 수있는 표현식 만 찾는 옵션을 제안합니다.
xnor





5

apt , 16 9 바이트

@xnor의 관찰 덕분에 너무 많은 바이트를 절약했습니다.

_*AÉ vU}c

온라인으로 테스트하십시오! 더 큰 입력에서 몇 초가 걸릴 수 있습니다.

설명

_  *AÉ  vU}c    Implicit: U = input integer
Z{Z*A-1 vU}c    Ungolfed
Z{        }c    Loop through each integer Z in [0, -1, 1, -2, ...] and yield the first where
  Z*A             Z times 10
     -1           minus 1
        vU        is divisible by the input.
                Implicit: output result of last expression




1

파이썬 2 , 44 43 바이트

바이트 44 를 저장해 준 Fireflame241에 감사드립니다!

P=input();i=P/3
while i*10%P-1:i-=1
print i

온라인으로 사용해보십시오!

0와 사이에 정확히 하나의 숫자 P-110있습니다. 그러나 그 역수 u가보다 큰 경우 P/2, (u-P)또한 역의 값이고,보다 작은 절대 값을 갖습니다 u. 우리가 정말 고유 번호를 찾는 것으로 나타났다 그래서 x사이 -P/2P/2의 역이다 10.

위의 코드는 (의 층)에서 시작 P/2하여 역에 도달 할 때까지 아래로 내려갑니다. 이것은보다 몇 수 더를 위해 일어나야 -P/2너무 오래 같이 P보다 소수 크다 10. 보다 정확하게 P는에 대한 coprime 인 경우에만 종료됩니다 10.

편집 : 실제로 와 x사이에 있음을 알 수 있으므로 현재 버전이 시작되고 그 아래로 내려갑니다. 이에 대한 설명은 향상된 바운드 라는 섹션을 참조하십시오 .-P/3P/3P/3

수학적 설명

왜 분열성 테스트가 효과가 있었는지는 즉시 알 수 없었습니다. 다른 사람이 궁금해하는 경우를 대비하여 설명합니다.

하자 P보다 소수, 클 10그의 마지막 자리입니다 b. 그러므로

P = 10a + b

여기서 a > 0, 및 0 <= b < 10. 사실에서 b중 하나입니다 1, 3, 7, 또는 9보다 주요 큰 때문에 10이 숫자 중 하나를 반드시 끝.

이제 가정 해 봅시다 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). 다시 말해 , modulo x의 역수입니다 .10P

이제 가정 해는 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, where 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.

특히 N >= 6P이면 |c + dx| < N. 따라서, 주어진 P우리가 계산에 의해 시작 2P, 3P, ..., 6P,와 함께 x. 그런 다음 주어진 N, 우리는 우리가보다 작은 숫자에 도달하거나 동일 할 때까지 반복적으로 가분성 테스트를 실행 6P하고, 결과는 숫자의 여부를 확인 0, P, 2P, ...,6P .

(물론, 음수에 도달 할 때마다 절대 값으로 대체합니다. 이는 if로만 q나눌 수 있기 때문에 괜찮습니다 .)P(-q)

향상된 바운드

나는 |x|/P결코 가까이에있는 것처럼 보이지 않았다 1/2. 실제로 그것은 항상 1/3... 보다 작 거나 더 자세히 살펴보면 항상 1/10또는에 매우 가깝습니다 3/10. 이제까지 얻은 가장 큰 것 같았다 4/13(때 발생하는 P=13x=4). 왜 이럴까요?

하자 u정수를하고 있다고 가정 10u = kP + 1어떤 정수에 대해 k, 그래서 u의 역이다 10모듈, P. 그리고 우리는 또한 모듈로 와 동등하기 때문에 k상대적으로 소수 임을 알고 있습니다.10k(-P)110

이제 우리는 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에서 u왼쪽은 절대 값이 최소화 될 때까지; 그러나 오른쪽이 최소화 될 때 왼쪽이 정확하게 최소화되므로 오른쪽이 절대 값으로 최소화 될 때까지 더하기 / 빼기 10를 원합니다 k.

그러나 우리는 이런 일이 벌어 질 것을 알고 k사이 -55, 따라서 (이후 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=4and k=3)입니다.

따라서 그 가장 큰 |x|/P적이다 얻을 수 3/10 + 1/(10*13)있기 때문에, P=13우리가 가지고있는 최초의 소수 k=3하고있는 사람 중 k=31/(10P)경우 용어는 가장 큰 P작은 (즉,에서 P=13). 그러므로 P우리 모두 에게도 있습니다 |x|/P <= 3/10 + 1/130 = 4/13 < 1/3. 위의 코드 i = P/3에서 시작하지 않고 초기화 할 수있는 이유를 설명합니다 P/2.

또한, 위 의 유용성 섹션 의 범위를 향상시킬 수 있습니다.

보조 정리는 : 보자 N = 10c + dc > 00 <= 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, 2P3P함께 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) + 3N변경.


아주 좋은 설명! -1괄호 외부 로 이동하여 바이트를 절약 할 수 있습니다 . 43 바이트
fireflame241

@ fireflame241 감사합니다! 나는 그것을 44에서 그대로 두었다고 주장 할 수 있었으므로 그것을 넘어갈 수 있었다 (그러나 이것이 거짓말 일 것이다).
mathmandan

1

공백 , 92 바이트

이 언어의 구문은 공백 으로 구성됩니다. 되므로 각 공백 문자 앞에 S, T 또는 L (각각 공백, 탭 및 줄 바꿈에 해당)이 접두어로 붙습니다. 기능을 잃지 않고 제거 할 수 있지만 올바르게 표시하기 위해 여기에 포함됩니다.

S S S L
T   L
T   T   S S S L
T   T   T   S L
S S S S T   T   L
T   S S L
S L
T   S S S T S T L
T   S T T   S L
S T S S S S S S T   S T L
T   S S T   T   S T S S S S T   L
T   S S S S S S T   S T S L
T   S T S T L
S T L
L
L
.

온라인으로 사용해보십시오!




0

엑셀, 27 바이트

=0.3/(MOD(A1,5)*2-5)*A1+0.1

셀에 다음과 같이 입력 할 수 있습니다

=.3/(MOD(A1,5)*2-5)*A1+.1

25 바이트이지만 Excel은 자동 업데이트됩니다.


실제로 입력 해야하는 바이트 수를 주장 할 수 있다고 생각합니다 (그러나 메타를 확인하기에는 너무 게으 릅니다).
Neil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.