3 10-adic küp kökünü bulun


24

10-adik bir sayıyı sonsuzca sola giden bir sayı veya 10'luk çok çok büyük bir tamsayı modulo olarak düşünmeyi seviyorum.

İşler sonsuzca sola taşınır ve yok olur. Ne demek istediğimi görmek için ...6667 * 3 = 1, 10-adic diyarında, sola taşıyan "2" nin sonsuza dek gittiğini unutmayın.

Toplama ve çarpma işlemi 10-adic sayılar için anlamlıdır, çünkü ntoplamın / ürünün son nrakamları sadece summan / multiplicand'ların son rakamlarına bağlıdır .


Verilen n, n10-adic küp kökünün son basamağını 3, yani xtatmin edici bir şekilde basmanız gerekir x*x*x = 3.

Bitiyor:

...878683312291648481630318492665160423850087895134587

Kodunuz n=1000gönderilmeden önce sonlandırılmalıdır .

Diyelim ki, basmanız gereken sayı sıfır ile başlıyorsa, o zaman ilk sıfırları basmanıza gerek yoktur, çünkü aslında ekstra sıfır basma noktası değildir.


Bu . Bayt cinsinden en kısa cevap kazanır.



1
Önde gelen sıfırları da yazdırmamız gerekiyor mu? Çoğu cevap (Java cevabım dahil) şu anda cevap vermiyor. yani n=12çıkışı 87895134587yerine 087895134587. Neredeyse tüm cevaplar .. geçersiz olacağından Şahsen ben, bu isteğe yapacak
Kevin Cruijssen

@KevinCruijssen bitti
Leaky Nun

Yanıtlar:


26

Python 2,33 bayt

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

Çevrimiçi deneyin!

powFonksiyon verimli modüler üs hesaplar 3**(10**k*2/3+1)%10**k.

Bize bir çözüm bulmamız istendi r**3 = 3 (mod 10**k). eHaritanın x -> x**e, küpleme x -> x**3çalışma modunun tersi olduğu bir üs bulmak istiyoruz 10**k, tıpkı RSA'daki şifre çözme ve şifreleme üstellerinin orijinal değeri üretmek için iptal etmesi gibi. Bu (x**3)**e = x (mod 10**k)herkes için anlamına gelir x. (Bunun boyunca varsayıyoruz gcd(x,10) = 1.) Sonra, rküpü almak için ters çevirerek iyileşebiliriz r = 3**e (mod 10**k).

Genişleyerek (r**3)**e = r (mod 10**k), biz

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

3*e-1Birçok kopyanın bize vermesinin çoğalmasının bize garanti ettiğini garanti eden bir üs arıyoruz 1.

Çarpma modülü 10**k, tersinir sayılar için bir grup oluşturur gcd(x,10) = 1. Lagrange Teoremi olarak, x**c = 1burada cgruptaki elementlerin sayısıdır. Grup modulo için N, bu sayım Euler totient değeridir φ(N), gelen değerlerin sayısı 1için Nbu nispeten asal olan N. Yani biz var r**φ(10**k) = 1 (mod 10**k). Bu nedenle, bunun 3*e-1bir katı olması yeterlidir φ(10**k).

Hesaplıyoruz

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

Yani, 3*e-1bir katları olmak istiyoruz4 * 10**(k-1)

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

Birçok seçenek mümkündür r, ancak r=5kısa ifadeyi verir

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

ile ebir tam sayı. Küçük bir golf zemin bölme kısalır kullanarak eiçin 10**k*2/3+1ve ifade r = 3**e (mod 10**k)arzu edilen sonucu verir r.


1
Bunun nasıl çalıştığı hakkında daha ayrıntılı bir açıklama görmek isterim, çok güzel cevap!
Kritixi Lithos 7:18

Meli (r**3)**e = x (mod 10**k)olmak (r**3)**e = r (mod 10**k)? Ayrıca bu sadece bir tesadüf (2 * 10**k + 1)/3 = 1/3 (mod 10**k)mü?
H.PWiz

@ H.PWiz Evet, teşekkürler, tamir ettim. Bunun 3 için ters olması bir tesadüf olup olmadığından emin değilim. Kesinlikle 2 değil, diğer değerlerle değiştirmek işe yaramadığı için yeterli değil.
xnor

@xnor Bence bu yeterli. 2Herhangi bir numara ile değiştirebilmeniz gerekirx = 2 (mod 3)
H.PWiz

Her zamanki gibi, matematik kazanıyor!
Olivier Grégoire

18

Piton 2 (PyPy) , 55 50 bayt

@HP Wiz sayesinde -5 bayt !

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

Çevrimiçi deneyin!

(Bruteforcing olmayan) hane basamakını hesaplar, bu nedenle kaba kuvvetten daha hızlıdır.

Exec olmayan sürüm

açıklama

( Bunu bulmak için teşekkürler @Leaky Nun ve @ user202729 )

İlk olarak, gözlemlemek o n**3bir involisyon modülo 10 (yani fonksiyon denir eğer f, o zaman f(f(n)) == n). Bu ayrıntılı bir arama kullanılarak onaylanabilir.

Bir sonraki basamağı bulmak için matematiksel indüksiyonu kullanabiliriz.
Izin olmak (sağdan) sayısının inci haneli.dnn

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

Şimdi, biz numarasını bilmek farz küncü basamağa,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 ) (Binom genişlemesi.)
(Diğer iki terimin 0 mod 10 k + 1 olduklarından ihmal edilebileceğini unutmayın )
3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )

Biz biliyoruz ki:

       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 )

Bu yerine:

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)
           K d k + 1 ≡ 3 · (3 - x 3 ) ÷ 10 k    (mod 10) (3, 7 mod 10'un tersidir)

Aslında bu çözümün optimum olması muhtemeldir. (Formülün kaba zorlamadan daha az ayrıntılı olduğu birçok dilde) Açıklama oldukça dağınık halde sohbetin bir yerinde bulunabilir .
user202729

Eğer "icat etmeyen" çözümü değerlendirmeyi amaçlıyorsanız, bu işlev bir işlev yerine 62 bayt için tam bir program olarak çalışır
Bay Xcoder

Bu sadece ve için son 11rakamları basar . n=12n=13
Emigna

4
× ve x bazı yazı tiplerinde oldukça benzer görünüyor ve matematiği okumayı zorlaştırıyor. × yerine · (orta nokta) kullanmanızı önerebilir miyim? (Ve, belli ki, MathJax’a sahip olmak güzel olurdu ).
Peter Taylor



4

05AB1E , 17 13 bayt

7IGD3mN°÷7*θì

Liman içinde @ ASCII yalnızca 'in Python 2 (PyPy) cevap .
-4 bayt ve giden sıfır sayesinde çıkışlar için hata tespit @Emigna değiştirerek, T%N°*+ile θì.

Çevrimiçi deneyin.

Açıklama:

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 yaklaşımım golfed erdi ve böylece meydan artık lider sıfırları gerektirir olabilir daha golf muktedir?
sadece ASCII

@ ASCII-Sadece Belki, ama nasıl emin değilim. @Emigna benim için çoktan golf oynadı T%N°*+ve baştaki θìsıfır 'düzeltmesi' bu yaklaşımla güzel bir bonus oldu.
Kevin Cruijssen

4

Java 8, 158 156 141 136 135 bayt

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

Liman içinde @ ASCII yalnızca 'in Python 2 (PyPy) cevap . @Neil
sayesinde -2 bayt . Sadece @ ASCII sayesinde -20 bayt .

NOT: Algoritmik bir yaklaşım kullanan @ OlivierGrégoire tarafından zaten çok daha kısa bir Java cevabı varmodPow .

Çevrimiçi deneyin.

Açıklama:

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, sen de bu algoritmayı kullandın? Cevabımı geri alıp değişiklikleri ekleyeceğim;)
Olivier Grégoire

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

@Neil Tabii ki .. teşekkürler. Ben java.math.BigInteger t=null,r=u.valueOf(7);t=r;ekledim önce başlangıçta ubazı bayt kaydedin.
Kevin Cruijssen


1
* modpow, modpod değil: P
sadece ASCII

4

Java (JDK 10) , 106 bayt

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

Çevrimiçi deneyin!

Kredi


1
166 bayt için döngü değiştirerek for(int l=0,d;++l<=n;ve değişen BigInteger I=null;için var I=new BigInteger("3");biz yeniden kullanabilir.
Kevin Cruijssen

1
Döngüyü değiştirerek kaydetmek için 1 bayt daha for(int l=0,d;l++<n;).
Kevin Cruijssen




1

Pyth , 23 bayt

Tabii ki, bu sadece ASCII'nin yaklaşımını kullanır.

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

Burada dene!


1
@DigitalTrauma Oh> _ <Yemin ederim cevabınızı farketmedim lol ... İlk önce ASCII'nin çözümünün bir limanı vardı, sonra xnor'ı gördüm ve doğrudan golf için taşıdım: PI sanırım ilk revizyona geri döneceğim olsa.
Bay Xcoder

1

Kömür , 26 22 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

≔⁷η

Sonucu 7'ye sıfırlayın. (7 olması gerekmez, ancak 0 çalışmıyor.)

FN

Gerekli basamak sayısının üzerine gelin.

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

Şimdi 4 bayttan tasarruf etmek için @ HPWiz'in yaklaşımını kullanıyor.

Iη

Sonucu yazdırın.

İşte rastgele değerlerin küp köklerini alan 28 baytlık bir kaba kuvvet sürümü:

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. İlk girdi hane sayısı, ikincisi kök değeridir.


HPWiz benim yaklaşımımı güncelledi (okudu: golf attı). Ayrıca, Leaky Nun gereklilikleri güncellediğinden dolayı stringmap'e artık ihtiyaç duyulmamalıdır. ayrıca ilk bağlantı ayrıca kaba kuvvet versiyonunu> _>
yalnızca ASCII

@ ASCII-Yalnızca Teşekkürler, Bağlantıları düzelttim ve HPWiz'in yaklaşımını taşıdım, ancak kters liste ile 10 numara bazında birleştirmek için StringMap'e ihtiyacım vardı .
Neil

Hmm. Ben sadece bunu yaparken sade numara yolunu golf olabilirdi düşündüm. Sanırım değil
ASCII-sadece

@ ASCII-only Kullandığım önceki sürüm için Base(Reverse(u), 10)ön ekleme k, bir dize olarak yapılırken 4 bayt tutarken Cast, hesaba katıldıktan sonra 1 baytlık bir tasarrufla sonuçlanan sadece 2 bayt tutar .
Neil

1

J , 33 bayt

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

TIO

@ ASCII- only'nin cevap portu fakat sabit modulo 10 ^ n kullanıldı


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.