Qa ikinci dereceden bir kalıntı mıdır?


22

Verilen iki girdi , ikinci dereceden bir tortu olup q nolmadığını belirler .qn

Yani, orada bir xyerde x**2 == q (mod n)ya da qbir kare mod n?

Giriş

İki tamsayı qve nnerede qve nherhangi bir tamsayı 0 <= q < n.

Çıktı

Bir truthy veya bir falsey.

İsteğe bağlı olarak, herhangi birini (veya tümünü) basın x.x**2 == q (mod n)

Örnekler

>>> quadratic_residue(1, 5)
True
>>> quadratic_residue(3, 8)
False
>>> quadratic_residue(15, 22)
True

kurallar

Kodunuz bir program veya işlev olmalıdır. Girişler herhangi bir sırada olabilir. Bu kod golf, bayt cinsinden en kısa kod kazanır.

Herhangi bir şey net değilse veya başka türlü düzeltilmesi gerekiyorsa, lütfen bana bildirin.

Bonuslar

  • Eğer fonksiyonunuz qherhangi bir tamsayı olarak kabul ederse 2-byte bonus .

Katalog

var QUESTION_ID=65329;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=47581;var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=true,comment_page;function answersUrl(index){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(index,answers){return"http://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=false;comment_page=1;getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}getAnswers();var SCORE_REG=/<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,});else console.log(body)});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<a>'+lang+'</a>').text();languages[lang]=languages[lang]||{lang:a.language,lang_raw:lang.toLowerCase(),user:a.user,size:a.size,link:a.link}});var langs=[];for(var lang in languages)if(languages.hasOwnProperty(lang))langs.push(languages[lang]);langs.sort(function(a,b){if(a.lang_raw>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)return-1;return 0});for(var i=0;i<langs.length;++i){var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;width:290px;float:left}#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table>


5
Bazı mevcut cevaplar bunu varsayıyor 0 <= q < n. Muhtemelen bunun kabul edilebilir bir varsayım olup olmadığını netleştirmelisiniz.
Peter Taylor

1
Ben isterdi qve nherhangi iki tamsayı olmak, ama mevcut cevapları bozmaması için,0 <= q < n
Sherlock9

2
Bu durumda, mevcut spesifikasyonları takip etmedikleri gerekçesiyle mevcut cevapları “kırmanın” makul olacağını düşünürdüm ve sadece değiştirmek yerine ne söylediğini kastettiğini netleştiriyordunuz, ama şimdi çok geç.
Peter Taylor

Keyfi kabul eden çözümler için küçük bir ikramiye verebilirsinizq
Bakuriu

Yanıtlar:


6

Pyth, 9 bayt

}Em%*ddQQ

Çevrimiçi deneyin: Gösteri veya Test Paketi

Açıklama:

}Em%*ddQQ   implicit: Q = first input number
  m     Q   map all numbers d of [0, 1, ..., Q-1] to:
    *dd       d*d
   %   Q      mod Q
            this gives the list of all quadratic residues
 E          read another input number
}           check, if it appears in the list of quadratic residues

Ben girdi olarak 7 9 koyarak denedim ve 7 5 ^ 2 mod 9. eşdeğer olmasına rağmen, "Yanlış" dedi
Nick Matteo

@kundor Tamsayıları ters sırada okudum. İlk nve daha q. Öyleyse 9\n7giriş olarak dene .
Jakube

8

Mathematica, 25 bayt

AtomQ@PowerMod[#,1/2,#2]&

Mathematica, Mathematica olan doğal olarak modulo nth köklerini hesaplamak için bir yapıya sahiptir PowerMod. Bir çözüm varsa, mümkün olan en küçük çözüm iade edilir, aksi takdirde orijinal ifade (artı bir mesaj).

Gerçek bir rutubet / sahtekarlık çıktısı elde etmek için sonucu iletiriz AtomQki bu, bir ifadenin parçalanıp bozulmayacağını kontrol eder. Tamsayılar atomiktir, döndürürler True, atomik olmayan PowerMod[q,1/2,n]döndürürlerFalse

Golf ipuçları ve benimle fonksiyon avcılık için @ MartinBüttner teşekkürler.


Aptal argüman sipariş
CalculatorFeline

Ne?! PowerModKesirli bir argüman alabileceğini bilmiyordum !
Greg Martin,

8

Par , 11 9 bayt

✶X[²x%)↔,

Her karakter sadece bir bayt kullanır; buraya bakınız .

açıklama

✶              ## Read two numbers
X              ## Assign second to x
[              ## Map
 ²             ## Square
 x%            ## Mod x
)              ## 
↔              ## Swap
,              ## Count

Jakube sayesinde iki bayt kaldırıldı.



5

Haskell, 31 bayt

Martin Büttner sayesinde 3 bayt kurtarıldı.

q#n=elem q[mod(x^2)n|x<-[1..n]]

1
Ayrıca 31 bayt: q#n=any(\x->mod(x*x)n==q)[0..n]ve 30 bayt: q#n=[x|x<-[0..n],mod(x*x)n==q]doğru / yanlış yerine x / boş listesinin listesini döndürür.
nimi

5

Matlab, 29

Bu işlev tüm sayıları 0'dan n'ye kareler ve bir kare eksi q'nun sıfır mod n olup olmadığını kontrol eder.

@(q,n)any(~mod((0:n).^2-q,n))

4

Prolog (SWI), 34 bayt

Kod:

Q*N:-between(0,N,X),X*X mod N=:=Q.

Açıklama:
arasında bir kare kontrol eder, eğer 0 ve N yaprakları Q ile bölündüğü zaman , N .

Örnek:

3*8.
false

15*22.
true

Burada çevrimiçi deneyin


4

CJam, 11 bayt

{_,2f#\f%&}

Bu adlandırılmamış blok q nyığında bekler ve yığında [q]truthy değeri ya ""da sahte bir değer olarak bırakır.

Burada test et.

Sp3000’e verilen kredilerde bu çözüm de ortaya çıktı ancak “sıkıntıya giremedi”.

açıklama

_,  e# Duplicate n and turn into range [0 1 ... n-1]
2f# e# Square each element in the range.
\f% e# Take each element in the range modulo n.
&   e# Set intersection with q to check if any square yields q (mod n).

4

J, 9 bayt

e.]|i.^2:

Kullanımı:

   1 (e.]|i.^2:) 5
1
   3 (e.]|i.^2:) 8
0
   15 (e.]|i.^2:) 22
1

Açıklama:

e.]|i.^2:
    i.    [0..N-1]
      ^   to the power of
       2: 2 (constant 2 function)
  ]|      mod N       
e.        contains Q? (0/1 result)

Bazı J mekaniği trivia:

Fonksiyonlar yinelemeli olarak sağdan 3'e göre gruplandırılır ve bizim durumumuzda ( e. (] | (i. ^ 2:))) olduğu gibi, bir sol varsa , gruplandırılmış kısım, orijinal sol ile çağrılan doğru argümanla ( N) ve solda bırakma fonksiyonuyla ( e., "içerir") çağrılır. argument ( Q) ve gruplandırılmış bölümün sonucu.

( e.]|i.*i.ve e.]|2^~i.aynı uzunlukta problemi de çözer.)

Burada çevrimiçi deneyin.


3

Mathematica, 27 bayt

PowerModList[#,1/2,#2]!={}&

Kullanımı:

In[1]:= PowerModList[#,1/2,#2]!={}&[1,5]

Out[1]= True

3

Javascript ES6, 42 bayt

(q,n)=>[...Array(n)].some((x,y)=>y*y%n==q)

Ciddi baytlar için @ apsilers kredileri kaydedildi!


Nedir ...Arraysözdizimi? Hala anlamadım.
Tomáš Zato - Monica,

Umarım bu düzenleme sizin için daha iyidir.
Mama Fun Roll

[...Array(5)]tek ile undefinedaynı diziyi üretir Array(5). Kafam karıştı, çünkü garip sözdizimini kaldırmak ve kullanmak sadece Array(5)kodu kırar. Bunun için herhangi bir dokümantasyon var mı? Konsol ekran görüntüsü
Tomáš Zato - Monica

1
@ TomášZato Array(5)haricinde kendi özelliklerine sahip olmayan bir dizidir length. Dizi yayılımı [...x], eksik olan sayısal özellikleri doldurur length. mapİşlevi yalnızca kaybolmamış özelliklerinde çalışabilir Array(5)yalnız yoktur. Örneğin, Array(5).hasOwnProperty(0)(false) yerine [...Array(5)].hasOwnProperty(0)(true) deneyin .
apsillers

1
Ayrıca, kullanma somedaha kısa ve (bence) eşdeğer:(q,n)=>[...Array(n)].some((x,y)=>y*y%n==q)
apsillers

2

Cidden , 20 bayt

,;R@,;╗@%╝`ª╜@%╛=`MΣ

İki satırda girdi alır: qo zaman n. Çıkışlar bir 0eğer qbir kuadratik kalan değil n, kaç temsil başka pozitif bir sayı xiçinde [1, q](dahil) tatmin x^2 = q (mod n).

Çevrimiçi deneyin (kalıcı bağlantılarda daha fazla sorun var, ancak kodu kopyalayıp bu arada boş bir sayfaya yapıştırabilirsiniz )

Açıklama:

,;R      get q input, duplicate, push range(1, q+1)
@,;╗     move the list to the back of the stack, get n input, dupe, save in reg 0
@%╝      calculate q mod n and save to reg 1
`ª╜@%╛=` push this function:
  ª╜@%     square top of stack, push reg 0 value (n), swap, and mod
  ╛=       push reg 1 value (q mod n), compare equality (1 if equal else 0)
MΣ       map the function across the range, add results

2

Python 3, 41 40 bayt

Alır qve nve belirler qgelen kareler bir listede olduğu 0için kare n-1kare.

lambda q,n:q in[i*i%n for i in range(n)]


1

Julia, 30 bayt

f(q,n)=q∈[i^2%n for i=0:n-1]

Bu, fiki tam sayı kabul eden ve bir boole döndüren bir işlevdir .

Ungolfed:

function f(q::Integer, n::Integer)
    # Generate an array of quadratic residues
    x = [i^2 % n for i = 0:n-1]

    # Determine whether q is one of these values
    return q  x
end

1

JavaScript (ES6), 43 bayt

(q,n)=>eval('for(x=n,r=0;x--;)r+=x*x%n==q')

açıklama

(q,n)=>
  eval(`              // eval allows us to use a for loop without {} or return
    for(x=n,r=0;x--;) // iterate over all possible values of x
      r+=x*x%n==q     // r = the number of matching x values
  `)                  // implicit: return r

Ölçek


Bu @ user81655 @ truthy / falsey koşulu üzerinde çok ilginç bir özelliktir. Harika iş!
Sherlock9


1

Japt, 10 bayt

Vo d_²%V¥U

Benim ilk resmi Japt golfum! Bir bayt tasarrufu için @ETHProductions teşekkürler!

Ungolfed / Açıklama

Vo d_  ²  %V¥ U
Vo dZ{Zp2 %V==U}  // implicit: U,V = inputs
Vo                // Create a range from 0 to n-1
   dZ{         }  // Check if any element Z in the range satisfies the condition:
       Zp2        // Is Z squared...
           %V     // modulo n...
             ==U  // equal to q?
                  // implicit output

Çevrimiçi deneyin!


1
Güzel! İpucu: 0oVeşittir Vo.
ETHProductions

Bunu bilmiyordum. Teşekkürler!
Mama Fun Roll

0

LinqPad'deki C # 6 (.Net Framework 4.6), 60 Bayt

bool b(int q,int n)=>Enumerable.Range(1,n).Any(y=>y*y%n==q);

0

Samanyolu 1.0.2 , 41 bayt

:>&{~1-:2h<:>n>;:>;<<b?{_a0_^}~;?{_0_1}}!

Bu bekler qve nsadece yığında olmak. Sırasıyla hakikat ve yanlış değerler için a 1veya çıktılar 0.



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.