Büyülü Modulo Kareleri


11

Ben sayı teorisinin büyük bir hayranıyım. Sayı teorisinde büyük bir şey modüler aritmetiktir; tanım abmodm ise ve sadece mab . Yapılması eğlenceli bir şey güçlere yükseltmektir: özellikle modül asal bir sayı olduğunda. Özellikle, a ve m nispeten asal ise ( 1 dışında ortak bir faktör paylaşmıyorsa ) , ^ e \ equiv 1 \ mod m olacak şekilde bir e sayısı olduğu kanıtlanmıştır .ae1modm

Egzersizin ne olduğunu bir örnekle açıklayacağım. Bir m=7 modülünü alalım . Program veya işlevin olası bir çıktısı şu şekildedir:

3 2 6 4 5 1
2 4 1 2 4 1
6 1 6 1 6 1
4 2 1 4 2 1
5 4 6 2 3 1
1 1 1 1 1 1

Her satır, o satırdaki ilk sayının güçlerinin bir listesidir: ilk satır 3,32,33,,36 ve bu 3,2,6,4,5,1 modülo 7 . Yukarıdaki karenin ikinci sırası , sadece 1'in güçleri olan son sıraya kadar 2 , vb. Kuvvetleridir .1

Bu büyülü bir modulo meydanı çünkü:

  • Kare simetriktir; yani, i sütun i . satırla aynıdır .
  • 1 ila m1 tüm değerler en az bir kez görünür.

Aşağıda, için gücünden başlayarak geçerli diğer tek çıktı verilmiştir :m=75

5 4 6 2 3 1
4 2 1 4 2 1
6 1 6 1 6 1
2 4 1 2 4 1
3 2 6 4 5 1
1 1 1 1 1 1

Meydan okuma

Asal bir pçıktı veren büyülü bir modulo karesi, yani yan uzunlukları olan bir kare p-1, her satır satırdaki ilk öğenin ardışık güçlerinin bir listesi olacak ve sütunlar için aynı olacak şekilde bir işlev veya program oluşturun . Tüm sayılar arasındaki 0ve pgerçekleşmelidir ve kare yalnızca bu aralıktaki sayıları içerebilir.

Girdi bir sayı veya bir dizedir ve çıktı ascii, bir matris, bir dizi dizisi (herhangi bir makul biçim) olabilir.

Bu kod golf, bu yüzden en kısa kod kazanır.


İlgili OEIS dizisi: A001918 (sol üst köşe için geçerli en düşük değer).
Arnauld

2
" Bir örnekle egzersizin ne olduğunu açıklayacağım. " Yapma. Kendi terimleriyle açıklayın ve daha sonra açıklamak için bir örnek verin. Ben ne için soruyorsun bir matris olduğunu düşünüyorum şekilde ilkel kök modülo olan ve , ancak bu spesifikasyonu sorudan soru olarak çıkarmak çok çaba gerektirir. AA1,1pAi,j=A1,1ijmodp
Peter Taylor

2
@PeterTaylor true ve demek istediğim bu, ama ilk olarak keşif eğlencesinin bir kısmını bozar ve ikincisi, ilkel kökler ve modüler aritmetik hakkındaki bilgilere dayanır. Bu sorunun bundan daha geniş bir kitle tarafından cevaplanmasını istedim, bu yüzden ne demek istediğimi daha kolay anlatmaya çalıştım.
vrugtehagel

Yanıtlar:


5

Jöle , 13 10 bayt

-3 Nick Kennedy sayesinde

Gibi hissediyor tekrarlanan kod olmalıdır golf yapabiliyor, ama ben var başaramadı d it ...

*€Ṗ%µQƑƇḢị

Çevrimiçi deneyin! (altbilgi ızgara olarak güzel biçimler)

Nasıl?

*€Ṗ%µQƑƇḢị - Link: integer, p
 €         - for each n in [1..p]
*          -   exponentiate with:
  Ṗ        -     pop = [1..p-1]
           - ...i.e [[1^1,1^2,...,1^(p-1)],[2^1,2^2,...,2^(p-1)],...,[....,p^(p-1)]]
   %       - modulo p
    µ      - start a new monadic chain (call that list of lists X)
       Ƈ   - keep those which:
      Ƒ    -   are invariant under:
     Q     -     de-duplicate
        Ḣ  - head
         ị - index into the list of lists X


Ahha, şimdi yavaş hissediyorum; p teşekkürler!
Jonathan Allan

3

Kömür , 36 bayt

≔E…¹θ﹪Xι…¹θIθηE⊟Φη⁼¹№ι¹⪫E§η⊖ι◧IλL⊖θ 

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Not: Sondaki boşluk. Açıklama:

≔E…¹θ﹪Xι…¹θIθη

Bir oluşturma p-1ile p-1yetkilerini dizi 1..p-1indekslerine 1..p-1(modül p).

E⊟Φη⁼¹№ι¹

Tam olarak bir tane olan satırlardan birini eşleyin 1.

⪫E§η⊖ι◧IλL⊖θ 

Satırları seçilen satır tarafından verilen sıraya göre yeniden düzenleyin ve çıktıyı biçimlendirin.




2

JavaScript (ES7),  91  86 bayt

Bu sürüm, uygulamadan önce güçleri hesaplamaya çalışır ve hassasiyet kaybı nedeniyle için başarısız olur . Aksi takdirde aşağıdaki yorumlanan sürümle aynı mantığı kullanır.p11

f=(p,k)=>(g=k=>[...Array(i=p-1)].map(_=>k**++i%p))(k).sort()[1]>1?g(k).map(g):f(p,-~k)

Çevrimiçi deneyin!


JavaScript (ES6),  92  87 bayt

Bu sürüm, (çok) daha yüksek giriş değerlerini desteklemek için modüler üs alma kullanır.

f=(p,k)=>(g=k=>[...Array(p-1)].map(_=>n=n*k%p,n=1))(k).sort()[1]>1?g(k).map(g):f(p,-~k)

Çevrimiçi deneyin!

Nasıl?

İlk satırı bulma

Verilen şekilde, yardımcı işlevini kullanın için işlem için .1k<pgak(n)=knmodp1n<p

g = k =>              // k = input
  [...Array(p - 1)]   // generate an array of size p - 1
  .map(_ =>           // for each entry in there:
    n = n * k % p,    //   update n to (n * k) mod p
    n = 1             //   starting with n = 1
  )                   // end of map()

Biz aramaya yalnızca bir değer var, öyle ki öyle ki . Biz dizi sıralama ve test ederek 2 eğer bunu nd eleman büyüktür .knak(n)=111

g(k).sort()[1] > 1

Bu, varsayılan davranış olan sözlükbilimsel sırayla bile çalışır, sort()çünkü:

  • birkaç tane varsa , hepsi sayısal sırayla olduğu gibi öne taşınır1
  • varsa sadece tek , 2 nd değer büyüktür olacak gerçekten 2 ise, ne olursa olsun nd değer sayısal sırayla veya olmasın111

Misal:

İçin :p=17

  • için şunu elde ederiz: k=1
    • a1=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    • olarak sıralandı[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
  • için şunu elde ederiz: k=2
    • a2=[2,4,8,16,15,13,9,1,2,4,8,16,15,13,9,1]
    • olarak sıralandı[1,1,13,13,15,15,16,16,2,2,4,4,8,8,9,9]
  • için şunu elde ederiz: k=3
    • a3=[3,9,10,13,5,15,11,16,14,8,7,4,12,2,6,1]
    • olarak kriteri[1,10,11,12,13,14,15,16,2,3,4,5,6,7,8,9]

Matrisi oluşturma

Biz bulduktan sonra , biz çağırmak tekrar çağırmak (sıralanmamış dizinin sürümünü almak için) her öğesi üzerinde matrisin sıra inşa.kg(k)gg(k)

Bu bölüm basitçe şu şekilde yazılabilir:

g(k).map(g)

.indexOf(1)>p-33 bayt tasarruf sağlar .every.
Neil

@Neil Teşekkürler. Ama iyi bir gece uykusundan sonra daha kısa bir yol buldum. :)
Arnauld

2

Zsh , 117 90 bayt

b=$1
c=(eval set -- '$[x**'{1..$[b-1]}%b\])
for ((;${#${(u)@}}-b+1;++x))$c
for x;$c&&<<<$@

Çevrimiçi deneyin! Çevrimiçi deneyin!

Tanrı ruhuma merhamet etsin. Burada bir sürü kötü uygulama var, en azından en büyük suçluyu açıklayayım:

c=(eval set -- '$[x**'{1..$[b-1]}%b\])
                      {1..$[b-1]}        # brace expansion, expands immediately
               '$[x**'           %b\]    # string literals, expand during eval
   eval set --                           # sets the positional parameters
c=(                                   )  # defines c to the words contained

Örnek b=4:

c=(eval set -- '$[x**'{1..$[b-1]}%b\])
c=(eval set -- '$[x**'{1..3}%b\]     )                # $[b-1] => 3
c=(eval set -- '$[x**1%b]' '$[x**2%b]' '$[x**3%b]' )  # brace expansion

Son olarak, $cprogramın geri kalanında göründüğü yerde dizi elemanları olarak değerlendirilir eval set -- .....

Son olarak, ${#${(u)@}}konumsal parametrelerdeki benzersiz öğeleri sayar (yani: bir döngü var 1mı / var mı?)

Aşağıdaki 117 bayt yanıtla ilgili yorumlar.


Aşmamız gereken zorluklar:

  • Çok boyutlu veya iç içe diziler yok. Bunun yerine, dizeleri bir döngüde alırken yazdırırız.
  • Belirli bir satırda birden fazla 1 varsa test seçenekleri:
    • ${#${(M)a:#1}: :#eşleşmeyi kaldırır ve (M)eşleşmeyi tersine çevirir. Böylece bu , dizideki s sayısına ( ${# }) genişleyecektir 1. Ne yazık ki bu genişleme, burada kullandığımız döngü aritmetiği ile iyi oynamıyor. Eğer öyleyse, potansiyel olarak bir bayt kurtarabilir.
    • ${${:-1}:*a}: Bu, singleton 1ile set arasındaki set kesişimidir a. 1Dizide bulunursa, bu tekil genişler . Bu seçeneği kullanarak, burada bir karakter kaydederiz, ancak 1son satır ve sütuna sonuna kadar ekleyerek ertelemek zorunda kaldığımızda 1 kaybederiz .
f(){ # f [element] [modular base], puts powers up to n-2 into array $a
    a=()
    for i ({1..$[$2-2]})
        a+=($[$1**i%$2])
}
a=(1)                     # put 1 in a to force first loop iteration
for ((;${${:-1}:*a};))    # test for 1 in array $a
    f $[++x] $1           # increment x, iterate through all elements mod $1
for y ($a 1){             # for all elements in the [last array, 1]
    f $y $1               # put that row in $a
    <<<$a\ 1              # print out $a with 1 appended (space-delimited string)
}

1

Perl 6 , 65 57 bayt

{.[|.first(*.Set+2>$_)]}o{.&{@=(($++X**1..^$_)X%$_)xx$_}}

Çevrimiçi deneyin!

Muhtemelen sadece karenin çıktısını almanın bir yolu vardır, ancak bu, soruda özetlenen aynı işlemi yapar, listeleri ilk listedeki konumlarına göre yalnızca 1'den giriş-1'e izin verir. Liste listesi olarak döner.

BTW, Perl 6'nın dizilere karşı dizileri ve anonim değişkenleri içeren sinir bozucu sınırlamalarından bazılarını çözmeye çalışan çok sayıda jokey var.

Açıklama:

                               $++               xx$_    # Map 0 to i-1 to
                              (   X**1..^$_)             # n, n^2, n^3... n^(i-1)
                             (              X%$_)        # All modulo i
{                      }o{.&{                        }}  # Pass to the next function
 .[                   ]    # Index into that list of lists
   |.first(          )     # The list of the first list that
           *.Set+2>$_        # Has all the elements in the range 1 to i-1


1

05AB1E , 19 16 bayt

LεI<LmI%}ÐΘOÏн<è

@Emigna sayesinde -3 bayt .

Çevrimiçi deneyin (altbilgi 2D listeyi güzel yazdırmaktır).

Açıklama:

L          # Create a list in the range [1, (implicit) input]
 ε         # Map each number `y` in the list to:
  I<L      #  Create a list in the range [1, input-1]
     m     #  Get number `y` to the power of each number in this list
      I%   #  Take modulo-input on each number
         # After the map: triplicate this modified matrix
   ΘO      # Get the amount of 1s in each row
     Ï     # And only leave the rows with exactly one 1
      н    # Then only leave the first row which contains a single 1
       <   # Decrease each value by 1 to make it 0-indexed
        è  # And index each into the rows of the modified matrix to create a new matrix
           # (which is output implicitly as result)

1
LεI<LmI%}ÐΘOÏн<è16 bayt için.
Emigna

@Emigna Teşekkürler! Ben yerine yeterli olacağını fark etmedi UΣXyk.
Kevin Cruijssen



0

APL (NARS), 29 karakter, 58 bayt

{k←⍵∣⍺*⍳⍵-1⋄⊃{m∣k*⍵}¨⍳¯1+m←⍵}

Ölçek:

  f←{k←⍵∣⍺*⍳⍵-1⋄⊃{m∣k*⍵}¨⍳¯1+m←⍵}
  3 f 7
3 2 6 4 5 1
2 4 1 2 4 1
6 1 6 1 6 1
4 2 1 4 2 1
5 4 6 2 3 1
1 1 1 1 1 1
  5 f 7
5 4 6 2 3 1
4 2 1 4 2 1
6 1 6 1 6 1
2 4 1 2 4 1
3 2 6 4 5 1
1 1 1 1 1 1 
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.