Tìm khối lập phương 10-adic của 3


24

Tôi thích nghĩ về một số 10 adic là một số đi vô tận bên trái, hoặc một số nguyên modulo có công suất rất lớn là 10.

Mọi thứ mang theo vô tận bên trái và tan biến. Để xem những gì tôi muốn nói, hãy lưu ý rằng ...6667 * 3 = 1trong vùng đất 10 tầng, vì "2" mang bên trái đi đến vô cùng.

Phép cộng và phép nhân có ý nghĩa đối với các số 10 adic, vì các nchữ số cuối của tổng / sản phẩm chỉ phụ thuộc vào các nchữ số cuối cùng của phép triệu / bội.


Cho trước n, bạn cần in các nchữ số cuối của gốc khối 10 adic của 3, tức là xthỏa mãn x*x*x = 3.

Nó kết thúc:

...878683312291648481630318492665160423850087895134587

Mã của bạn phải chấm dứt n=1000trước khi gửi.

Giả sử rằng nếu số bạn cần in bắt đầu bằng 0, thì bạn không cần phải in các số 0 đứng đầu, vì thực tế đó không phải là điểm để in thêm các số 0.


Đây là . Câu trả lời ngắn nhất trong byte thắng.



1
Chúng ta có cần in số không hàng đầu không? Hầu hết các câu trả lời (bao gồm cả câu trả lời Java của tôi) hiện đang thất bại cho những câu trả lời đó. tức là n=12xuất ra 87895134587thay vì 087895134587. Cá nhân tôi sẽ làm cho nó tùy chọn, vì nó sẽ làm mất hiệu lực gần như tất cả các câu trả lời ..
Kevin Cruijssen

@KevinCruijssen đã hoàn thành
Leaky Nun

Câu trả lời:


26

Python 2 , 33 byte

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

Hãy thử trực tuyến!

Các powhàm số một cách hiệu quả tính toán số mũ mô-đun 3**(10**k*2/3+1)%10**k.

Chúng tôi được yêu cầu tìm một giải pháp để r**3 = 3 (mod 10**k). Chúng tôi muốn tìm một số mũ emà bản đồ x -> x**enghịch đảo với x -> x**3mod hoạt động 10**k, giống như số mũ giải mã và mã hóa trong RSA hủy để tạo ra giá trị ban đầu. Điều này có nghĩa là (x**3)**e = x (mod 10**k)cho tất cả x. (Chúng ta sẽ giả định trong suốt thời gian đó gcd(x,10) = 1.) Sau đó, chúng ta có thể phục hồi rbằng cách đảo ngược hình khối để có được r = 3**e (mod 10**k).

Mở rộng ra (r**3)**e = r (mod 10**k), chúng tôi nhận được

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

Chúng tôi đang tìm kiếm một số mũ 3*e-1đảm bảo rằng nhân lên mà nhiều bản sao mang lại cho chúng tôi 1.

Modulo phép nhân 10**ktạo thành một nhóm cho các số khả nghịch, đó là những nhóm có gcd(x,10) = 1. Theo Định lý Lagrange, x**c = 1nơi cđếm số phần tử trong nhóm. Đối với modulo nhóm N, số đó là giá trị tổng của Euler φ(N), số lượng giá trị từ đó 1đến Ntương đối nguyên tố N. Vì vậy, chúng tôi có r**φ(10**k) = 1 (mod 10**k). Do đó, nó đủ 3*e-1để là một bội số của φ(10**k).

Chúng tôi tính toán

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

Vì vậy, chúng tôi muốn 3*e-1là một bội số của4 * 10**(k-1)

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

Nhiều sự lựa chọn có thể cho r, nhưng r=5đưa ra biểu thức ngắn

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

với emột số nguyên. Một chút chơi golf sử dụng rút ngắn sàn-division eđến 10**k*2/3+1, và thể hiện r = 3**e (mod 10**k)cho kết quả mong muốn r.


1
Tôi muốn xem một lời giải thích chi tiết hơn về cách thức này hoạt động, câu trả lời rất hay!
Kritixi Lithos

Nên (r**3)**e = x (mod 10**k)được (r**3)**e = r (mod 10**k)? Ngoài ra nó chỉ là một sự trùng hợp ngẫu nhiên mà (2 * 10**k + 1)/3 = 1/3 (mod 10**k)?
H.PWiz

@ H.PWiz Vâng, cảm ơn, tôi đã sửa nó. Tôi không chắc chắn nếu nó là nghịch đảo trong 3 là một sự trùng hợp ngẫu nhiên. Điều đó chắc chắn là không đủ, vì thay thế 2 bằng các giá trị khác không hoạt động.
xnor

@xnor Tôi nghĩ thế là đủ. Bạn sẽ có thể thay thế để thay thế 2bằng bất kỳ số nàox = 2 (mod 3)
H.PWiz

Như thường lệ, toán học chiến thắng!
Olivier Grégoire

18

Python 2 (PyPy) , 55 50 byte

-5 byte nhờ @HP Wiz !

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

Hãy thử trực tuyến!

Tính toán (không bruteforcing) chữ số, vì vậy nó nhanh hơn lực lượng vũ phu.

Phiên bản không có exec

Giải trình

(Cảm ơn @Leaky Nun@ user202729 vì đã tìm ra điều này)

Đầu tiên, quan sát rằng đó n**3là một modulo involution 10 (nghĩa là nếu hàm được gọi f, thì f(f(n)) == n). Điều này có thể được xác nhận bằng cách sử dụng một tìm kiếm toàn diện.

Chúng ta có thể sử dụng cảm ứng toán học để tìm chữ số tiếp theo.
Gọi là chữ số thứ của số (từ bên phải).dnn

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

Bây giờ, giả sử chúng ta biết số lên đến kchữ số thứ,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 ) (Mở rộng nhị thức.)
(Lưu ý rằng hai thuật ngữ khác có thể bị bỏ qua vì chúng là 0 mod 10 k + 1 )
3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )

Chúng ta biết rằng:

       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 )

Thay thế điều này trong:

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 ) (mod 10)
                 ≡ (3 - x 3 ) (7 · 10 k ) (mod 10)
           ∴ d k + 1 3 · (3 - x 3 ) 10 k    (mod 10) (3 là nghịch đảo của 7 mod 10)

Trên thực tế giải pháp này có khả năng là tối ưu. (đối với hầu hết các ngôn ngữ có công thức ít dài dòng hơn so với cưỡng bức vũ phu) Giải thích có thể được tìm thấy ở đâu đó trong trò chuyện , mặc dù khá phân tán.
dùng202729

Nếu bạn nhắm đến việc chơi golf giải pháp "không thực thi", thì giải pháp này hoạt động với 62 byte như một chương trình đầy đủ thay vì một chức năng
Ông Xcoder

Điều này chỉ in các 11chữ số cuối cùng cho n=12n=13.
Emigna

4
× và x trông thực sự khá giống nhau trong một số phông chữ và làm cho toán học cực kỳ khó đọc. Tôi có thể đề nghị sử dụng · (dấu chấm trung tâm) thay vì × không? (Và, rõ ràng, thật tuyệt khi có MathJax ).
Peter Taylor



4

05AB1E , 17 13 byte

7IGD3mN°÷7*θì

Cổng của câu trả lời Python 2 (PyPy) chỉ dành cho @ ASCII .
-4 byte VÀ được sửa lỗi cho các đầu ra có các số 0 đứng đầu nhờ @Emigna , bằng cách thay thế T%N°*+bằng θì.

Hãy thử trực tuyến.

Giải trình:

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 đã đánh gôn cách tiếp cận của tôi, và thử thách không còn đòi hỏi các số 0 hàng đầu để bạn thể chơi gôn nhiều hơn?
ASCII - chỉ

@ Chỉ ASCII Có lẽ, nhưng không biết làm thế nào. @Emigna đã golfed T%N°*+để θìcho tôi, và các hàng đầu zero 'sửa chữa' chỉ là một tiền thưởng tốt đẹp với phương pháp này.
Kevin Cruijssen

4

Java 8, 158 156 141 136 135 byte

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;}

Cổng của câu trả lời Python 2 (PyPy) chỉ dành cho @ ASCII .
-2 byte nhờ @Neil .
-20 byte chỉ nhờ @ ASCII .

LƯU Ý: Đã có một câu trả lời Java ngắn hơn nhiều bởi @ OlivierGrégoire bằng cách sử dụng một cách tiếp cận thuật toán modPow.

Hãy thử trực tuyến.

Giải trình:

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

Oh, bạn đã sử dụng thuật toán đó quá? Tôi sẽ trả lời câu trả lời của tôi và thêm các thay đổi của bạn;)
Olivier Grégoire

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

@Neil Tất nhiên rồi .. cảm ơn. Tôi đã có java.math.BigInteger t=null,r=u.valueOf(7);t=r;ban đầu trước khi tôi thêm uđể lưu một số byte.
Kevin Cruijssen


1
* modpow, không phải modpod: P
ASCII - chỉ

4

Java (JDK 10) , 106 byte

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

Hãy thử trực tuyến!

Tín dụng


1
166 byte bằng cách thay đổi vòng lặp để for(int l=0,d;++l<=n;và thay đổi BigInteger I=null;để var I=new BigInteger("3");mà chúng ta có thể tái sử dụng.
Kevin Cruijssen

1
Thêm 1 byte để lưu bằng cách thay đổi vòng lặp thành for(int l=0,d;l++<n;).
Kevin Cruijssen




1

Bình thường , 23 byte

Tất nhiên, điều này sử dụng phương pháp chỉ của ASCII.

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

Hãy thử nó ở đây!


1
@DigitalTrauma Oh> _ <Tôi thề tôi đã không nhận thấy câu trả lời của bạn lol ... Lần đầu tiên tôi có một cổng giải pháp của ASCII, sau đó tôi thấy xnor và tôi đã chuyển nó trực tiếp sang golf , Tuy nhiên.
Ông Xcoder

1

Than , 26 22 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

≔⁷η

Khởi tạo kết quả thành 7. (Không phải là 7, nhưng 0 không hoạt động.)

FN

Lặp lại số lượng chữ số yêu cầu.

        η       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.

Bây giờ sử dụng phương pháp của @ HPWiz để lưu 4 byte.

Iη

In kết quả.

Đây là phiên bản vũ lực 28 byte lấy gốc khối của các giá trị tùy ý:

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Đầu vào đầu tiên là số chữ số, thứ hai là giá trị gốc.


HPWiz đã cập nhật (đọc: đánh gôn) cách tiếp cận của tôi. Ngoài ra, chuỗi sơ đồ không cần thiết nữa vì Leaky Nun đã cập nhật các yêu cầu. đồng thời, liên kết đầu tiên cũng trỏ đến phiên bản vũ phu> _>
ASCII - chỉ

Chỉ có ASCII Cảm ơn, tôi đã sửa các liên kết và chuyển cách tiếp cận của HPWiz, nhưng tôi cần StringMap để nối kvới danh sách đảo ngược làm số 10 cơ sở.
Neil

Hừm. Tôi đã nghĩ chỉ cần làm điều đó theo cách số đơn giản có thể là golfier. Tôi đoán là không
ASCII - chỉ

Chỉ @ ASCII Đối với phiên bản trước tôi đã sử dụng Base(Reverse(u), 10)nhưng tiền tố ksẽ có chi phí 4 byte trong khi thực hiện dưới dạng chuỗi chỉ tốn 2 byte dẫn đến tiết kiệm 1 byte sau khi tính Castđến tài khoản.
Neil


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.