3의 10- 아식 큐브 근을 구합니다


24

나는 10-adic 숫자를 무한히 왼쪽으로가는 숫자 또는 정수 모듈로 10의 매우 큰 거듭 제곱으로 생각하고 싶습니다.

물건은 왼쪽으로 무한히 운반되어 사라집니다. 내가 의미하는 바를 확인하려면 ...6667 * 3 = 1왼쪽으로 운반하는 "2"가 무한대로 진행되므로 10 개 대지에서

n합계 / 제품의 마지막 n숫자는 summands / multiplicands 의 마지막 숫자 에만 의존하기 때문에 덧셈과 곱셈은 10 자리 숫자에 적합합니다.


주어진 10 aic cube root의 n마지막 n자리수 3 을 인쇄해야합니다 ( 예 : x만족) x*x*x = 3.

끝났어:

...878683312291648481630318492665160423850087895134587

n=1000제출하기 전에 코드를 종료해야합니다 .

인쇄해야 할 숫자가 0으로 시작하는 경우 실제로 추가 0을 인쇄 할 지점이 아니기 때문에 선행 0을 인쇄 할 필요가 없다고 가정 해 봅시다.


이것은 입니다. 바이트 단위의 최단 답변이 이깁니다.



1
선행 0도 인쇄해야합니까? 대부분의 답변 (내 Java 답변 포함)은 현재 그에 대해 실패하고 있습니다. 즉, 대신에 n=12출력 . 개인적으로 나는 거의 모든 답변을 무효화하기 때문에 선택 사항으로 만들 것입니다.87895134587087895134587
Kevin Cruijssen

@KevinCruijssen 완료
Leaky Nun

답변:


26

파이썬 2 , 33 바이트

lambda k:pow(3,10**k*2/3+1,10**k)

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

pow함수는 모듈 식 지수를 효율적으로 계산합니다 3**(10**k*2/3+1)%10**k.

에 대한 해결책을 찾아야합니다 r**3 = 3 (mod 10**k). RSA의 암호 해독 및 암호화 지수가 원래 값을 생성하기 위해 취소하는 것처럼 ex -> x**e이 큐브 x -> x**3작업 모드 10**k와 반대 되는 지수를 찾고 싶습니다 . 이것은 (x**3)**e = x (mod 10**k)모든 것을 의미 합니다 x. (우리는 gcd(x,10) = 1그 전체를 가정 할 것입니다 .) 그런 다음, r큐빙을 뒤집어서로 구할 수 r = 3**e (mod 10**k)있습니다.

확장하면 (r**3)**e = r (mod 10**k)우리는

r**(3*e-1) = 1 (mod 10**k)

우리는 3*e-1많은 사본을 곱하면 우리에게주는 지수 를 찾고 1있습니다.

곱셈 모듈로 10**k는 가역 수에 대한 그룹을 형성합니다 gcd(x,10) = 1. Lagrange의 정리 에 따라 그룹의 요소 수는 x**c = 1어디 입니까 c? 그룹 모듈러스를 들어 N, 그 수는 오일러 totient 값은 φ(N)로부터의 값의 개수 1N그 비교적 소수이다 N. 그래서 우리는 있습니다 r**φ(10**k) = 1 (mod 10**k). 따라서 3*e-1의 배수 이면 충분합니다 φ(10**k).

우리는 계산

φ(10**k) = φ(5**k) φ(2**k)= 4 * 5**(k-1) * 2**(k-1) = 4 * 10**(k-1)`

그래서 우리 3*e-14 * 10**(k-1)

3*e - 1 = r * 4 * 10**(k-1)
e = (4r * 10**(k-1) + 1)/3

에 대한 많은 선택이 가능 r하지만 r=5짧은 표현을 제공합니다.

e = (2 * 10**k + 1)/3

e정수. 작은 골프 층 분할을 사용 짧아 e10**k*2/3+1한 표현은 r = 3**e (mod 10**k)원하는 결과를 제공한다 r.


1
이것이 어떻게 작동하는지에 대한 자세한 설명, 매우 좋은 답변을보고 싶습니다!
Kritixi Lithos 2016 년

해야 (r**3)**e = x (mod 10**k)(r**3)**e = r (mod 10**k)? 또한 우연의 일치 (2 * 10**k + 1)/3 = 1/3 (mod 10**k)일까요?
H.PWiz 2018 년

@ H.PWiz 예, 고맙습니다. 그것이 3의 역수인지 우연의 일치인지 확실하지 않습니다. 2를 다른 값으로 바꾸는 것은 효과가 없기 때문에 충분하지 않습니다.
xnor

@ xnor 충분하다고 생각합니다. 2x = 2 (mod 3)
H.PWiz

평소와 같이 수학이 승리합니다!
Olivier Grégoire

18

Python 2 (PyPy) , 55 50 바이트

@HP Wiz 덕분에 -5 바이트 !

n=p=1;exec"p*=10;n+=3*(3-n**3)%p;"*input();print n

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

숫자를 기준으로 숫자를 계산하여 (브 르트 포스가 아닌) 무차별 대입 속도보다 빠릅니다.

exec가없는 버전

설명

( @Leaky Nun@ user202729 에게 감사드립니다 )

먼저, n**3involution modulo 10 (즉, 함수가 호출 된 f경우 f(f(n)) == n) 임을 확인하십시오 . 철저한 검색을 통해 확인할 수 있습니다.

수학적 유도를 사용하여 다음 자리를 찾을 수 있습니다.
하자 수 (오른쪽에서) 숫자의 일 자리.dnn

d 1 3 ≡ 3 (mod 10)
 d 1 ≡ 3 3 (mod 10)
    ≡ 27 (mod 10)
    ≡ 7 (mod 10)

k자릿수 까지 숫자를 알고 있다고 가정 해 봅시다 .x

              x 3 ≡ 3 (mod 10 k )
  (d k + 1 · 10 k + x) 3 ≡ 3 (mod 10 k + 1 )
3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 ) (양이 확장)
(다른 두 항은 0 mod 10 k + 1 이므로 무시할 수 있습니다. )
3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )

우리는 그것을 알고 있습니다 :

       x ≡ 7 (mod 10)
      x 2 ≡ 49 (mod 10)
         ≡ 9 (mod 10)
  x 2 · 10 k ≡ 9 · 10 k   (mod 10 k + 1 )
3 · x 2 · 10 k ≡ 27 · 10 k (mod 10 k + 1 )
         ≡ 7 · 10 k   (mod 10 k + 1 )

이것을 다음으로 대체 :

3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )
  7 · d k + 1 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )
             d k + 1 ≡ (3-x 3 ) ÷ (7 · 10 k ) (모드 10)
                 ≡ (3-x 3 ) ÷ (7 · 10 k ) (모드 10)
           ∴ d k + 1 ≡ 3 · (3-x 3 ) ÷ 10 k    (mod 10) (3은 7 mod 10의 역수)

실제로이 솔루션은 최적 일 것입니다. (수식이 무차별 강요보다 덜 장황한 대부분의 언어에 대해) 설명은 상당히 흩어져 있지만 chat 어딘가에 있습니다 .
user202729 2016 년

당신은 골프에 "비 간부"솔루션을 목표로하는 경우 함수 대신 전체 프로그램으로 62 바이트 작품
씨 Xcoder

및 의 마지막 11숫자 만 인쇄합니다 . n=12n=13
Emigna 2016 년

4
×와 x는 일부 글꼴에서 매우 비슷해 보이며 수학을 읽기가 매우 어렵습니다. × 대신에 * (가운데 도트)를 사용하는 것이 좋습니다. (그리고 분명히 MathJax갖는 것이 좋을 것입니다 ).
피터 테일러



4

05AB1E , 17 13 바이트

7IGD3mN°÷7*θì

@ASCII 전용 의 Python 2 (PyPy) 답변 포트 .
-4 바이트의 선두에 제로 대비하여 출력용 버그 수정 @Emigna 대체함으로써, T%N°*+θì.

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

설명:

7               # Start result-string `r` at '7'
IG              # Loop `N` in the range [1, input)
  D3m           #  `r` to the power 3
       ÷        #  Integer-divided with
     N°         #  10 to the power `N`
        7*      #  Multiplied by 7
          θì    #  Then take the last digit of this, and prepend it to the result `r`
                # Implicitly output result `r` after the loop

HPWiz 내 접근 방식을 golfed 없다, 당신은 그래서 도전은 더 이상 앞에 0을 필요로 할 수 있습니다 그것은 더 골프를 할 수?
ASCII 전용

@ ASCII-only 아마도 방법이 확실하지 않습니다. @Emigna 는 이미 나를 위해 골프 T%N°*+를 쳤으며 θì, 제로 '수정'은이 접근법의 좋은 보너스였습니다.
Kevin Cruijssen

4

자바 (8) 158 156 141 136 135 바이트

n->{var t=n.valueOf(3);var r=n.ONE;for(int i=0;i++<n.intValue();)r=r.add(t.subtract(r.pow(3)).multiply(t).mod(n.TEN.pow(i)));return r;}

@ASCII 전용 의 Python 2 (PyPy) 답변 포트 . @Neil
덕분에 -2 바이트 . @ASCII 전용으로 -20 바이트
.

참고 : @ OlivierGrégoire의을 사용하는 알고리즘 접근 방식을 사용하면 Java 응답훨씬 짧습니다modPow .

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

설명:

n->{                            // Method with BigInteger as both parameter and return-type
  var t=n.valueOf(3);           //  Temp BigInteger with value 3
  var r=n.ONE;                  //  Result-BigInteger, starting at 1
  for(int i=0;i++<n.intValue();)//  Loop `i` in the range [1, n]
    r=r.add(                    //   Add to the result-BigDecimal:
       t.subtract(r.pow(3))     //    `t` subtracted with `r` to the power 3
       .multiply(t)             //    Multiplied by 3
       .mod(n.TEN.pow(i)));     //    Modulo by 10 to the power `i`
  return r;}                    //  Return the result-BigInteger

오, 그 알고리즘도 사용 했습니까? 나는 내 대답을 롤백하고 변경 추가 할 것)
올리비에 그레 구 아르에게

java.math.BigInteger u=null,r=u.valueOf(7),t=r;?
Neil

@ 닐 물론입니다. 감사합니다. 내가 가지고 java.math.BigInteger t=null,r=u.valueOf(7);t=r;내가 추가하기 전에 처음 u몇 바이트를 저장합니다.
Kevin Cruijssen


1
* modpow, modpod 아님 : P
ASCII 전용

4

자바 (JDK 10) , 106 바이트

n->n.valueOf(3).modPow(n.valueOf(2).multiply(n=n.TEN.pow(n.intValue())).divide(n.valueOf(3)).add(n.ONE),n)

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

크레딧


1
루프를 for(int l=0,d;++l<=n;변경 BigInteger I=null;하고 var I=new BigInteger("3");재사용 할 수 있도록 변경하여 166 바이트 .
Kevin Cruijssen

1
루프를로 변경하여 1 바이트를 더 절약 할 수 for(int l=0,d;l++<n;)있습니다.
Kevin Cruijssen




1

Pyth , 23 바이트

물론 이것은 ASCII 전용 접근 방식을 사용합니다.

K7em=+K*%*7/^K3J^TdTJtU

여기 사용해보십시오!


1
@DigitalTrauma Oh> _ <나는 당신의 대답을 알아 차리지 못했다고 맹세한다 ... 나는 먼저 ASCII 솔루션의 포트를 가지고 있었고, 나는 xnor를 보았고 그것을 골프에 직접 포팅했다. 그러나.
Mr. Xcoder

1

, 26 22 바이트

≔⁷ηFN≧⁺﹪׳⁻³Xη³Xχ⊕ιηIη

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔⁷η

결과를 7로 초기화하십시오 (7 일 필요는 없지만 0은 작동하지 않습니다).

FN

필요한 자릿수를 반복합니다.

        η       Current result.
       X ³     Take the cube. 
     ⁻³         Subtract from 3.
   ׳           Multiply by 3.
            ⊕ι  Increment the loop index.
          Xχ    Get that power of 10.
  ﹪             Modulo
≧⁺            η Add to the result.

이제 @HPWiz의 접근 방식을 사용하여 4 바이트를 절약하십시오.

Iη

결과를 인쇄하십시오.

다음은 임의의 값의 큐브 루트를 취하는 28 바이트 무차별 버전입니다.

FN⊞υ⊟Φχ¬﹪⁻XI⁺κ⭆⮌υμ³IηXχ⊕ι↓Iυ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 첫 번째 입력은 자릿수이고 두 번째 입력은 루트 값입니다.


HPWiz는 내 접근 방식을 업데이트했습니다 (읽기 : 골프). 또한 Leaky Nun이 요구 사항을 업데이트했기 때문에 더 이상 문자열 맵이 필요하지 않습니다. 또한 첫 번째 링크는 무차별 강제 버전> _>을 가리 킵니다
ASCII 전용

@ASCII 전용 감사합니다. 링크를 수정하고 HPWiz의 접근 방식을 이식했습니다. 그러나 k반대 목록과 기본 10 숫자로 연결하려면 StringMap이 필요했습니다 .

흠. 난 그냥 골퍼 방법으로 평범한 숫자 방법을하고 있다고 생각했을 것입니다.
ASCII 전용

@ ASCII-only 이전 버전 Base(Reverse(u), 10)에서는 접두사 k가 4 바이트 였지만 문자열로 2 바이트 만 사용하면 1 바이트가 절약 Cast됩니다.
Neil

1

J , 33 바이트

f=:3 :'((10x^y)|]+3*3-^&3)^:y 1x'

TIO

@ASCII 전용 답변 포트 이지만 전체에서 고정 모듈로 10 ^ n 사용


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.