Tüm q tamsayılarını üreten bir sayı bulun mod q


9

Tamsayılar modulo düşünün qnerede qasal olduğunu, bir jeneratör herhangi tamsayıdır 1 < x < qböylece x^1, x^2, ..., x^(q-1)tüm kapaklar q-1tamsayılar arasındaki 1ve q-1. Örneğin, modulo 7 tam sayılarını (olarak yazdığımız Z_7) düşünün . Sonra 3, 3^2 mod 7 = 2, 3^3 = 27 mod 7 = 6, 3^4 = 81 mod 7 = 4, 3^5 = 243 mod 7 = 5, 3^6 = 729 mod 7 = 1tüm değerleri 3, 2, 6, 4, 5, 1kapsar 1..6gerektiği gibi tüm tamsayıları kapsar .

Görev, bir girdi alan nve bir üretecin çıktısını çıkaran kod yazmaktır Z_n. Elbette bunu sizin için yapan herhangi bir yerleşkeyi veya kütüphaneyi kullanamazsınız.

Kodunuzun performansıyla ilgili tek kısıtlama, kodun tamamlanması için test edilmiş olması gerektiğidir n = 4257452468389.

Bunun gücü 2^n anlamına gelir . Bu üstellemeyi temsil eder.2n^


Hmm ... 1 < x < qbu meydan okumayı çok daha kolay hale getiriyor.
Outgolfer Erik

@EriktheOutgolfer Ne demek istediğini bildiğimden emin değilim? Bunlar 0 veya 1 olmayan tüm farklı tam sayılardır.

Demek istediğim, pek çok kişinin düşündüğünden daha kolay ... ya da belki de PPCG'de aktif olmayan bir an.
Outgolfer Erik

3
Ama insanların bunu çok sayıda tamamlamayı test etmelerinin gerekli olmadığını düşünüyorum ... temelde tio sadece hafıza hatası olurdu.
Outgolfer Erik

@Lembik Belirli bir sayı için jeneratörün olmadığı bir durum var mı? Bazı test senaryoları iyi olabilir.
Bay Xcoder

Yanıtlar:


13

Pyth, 16 15 bayt

f-1m.^T/tQdQPtQ

Test odası

P giriş ise, g ^ (p-1) = 1 mod p olduğunu biliyoruz, bu yüzden daha küçük a için g ^ a! = 1 mod p'yi kontrol etmemiz gerekiyor. Ancak, bunun mümkün olması için bir p-1 faktörü olmalı ve bu özelliğe sahip bir a'nın herhangi bir katı da bu özelliğe sahip olacaktır, bu yüzden sadece g ^ ((p-1) / q) öğesini kontrol etmeliyiz! = P-1'in tüm asal faktörleri q için 1 mod p. Böylece, çalışan bir tane bulana kadar, g tamsayılarını artan sırada kontrol ederiz.

Açıklama:

f-1m.^T/tQdQPtQ
f                  Return the first value T such that the following is truthy:
            PtQ    Take the prime factorization of the input - 1.
   m               Map those prime factors to
       /tQd        Take the input - 1 divided by the factor
    .^T    Q       Raise T to that exponent mod input,
                   performed as modular exponentiation, for performance.
 -1                Check that 1 is not found among the results.

Oldukça müthiş!

Kodunuz çarpanlara ayırmayı gerçekleştiriyor mu?

@Lembik Yapar ( PtQbölüm).
Outgolfer Erik


-3
%MATLAB CODE
%Program to generate Z_n for an integer n
n = input('Enter a number to find modulo')
q = input ('Enter a prime number greater than the number you wished to find modulo')
if n>=q 
   fprintf('Error')
   exit(1)
end
for R=1:q-1
    fprintf(rem(n.^R, q))
    fprintf('\n')
end

1
Bu doğru sorunu çözmüyor. Örneğin, kodunuz bir girdi almalı ve bir çıktı vermelidir.

1
Ayrıca, bu kod hiç golf değil. Golf kodunun olabildiğince kısa olması gerekir, böylece giriş metnini ve eşit işaretlerin etrafındaki boşlukları kaldırabilirsiniz.
SparklePony Yoldaş

3
@ComradeSparklePony Bence doğru sorunu
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.