Ist q ein quadratischer Rest von n?

22

Bei zwei gegebenen Eingaben q nbestimmen Sie, ob qein quadratischer Rest von n.

Das heißt, gibt es eine xWo- x**2 == q (mod n)oder qeine Quadratmodifikation n?

Eingang

Zwei ganze Zahlen qund n, wo qund nsind irgendwelche ganzen Zahlen 0 <= q < n.

Ausgabe

Ein Wahrer oder Falscher.

Drucken Optional kann jede (oder alle) xdas ist ,x**2 == q (mod n)

Beispiele

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

Regeln

Ihr Code muss ein Programm oder eine Funktion sein. Die Eingaben können in beliebiger Reihenfolge erfolgen. Dies ist Code Golf, also gewinnt der kürzeste Code in Bytes.

Wenn etwas unklar ist oder anderweitig repariert werden muss, lassen Sie es mich bitte wissen.

Boni

  • 2-Byte-Bonus, wenn Ihre Funktion qeine beliebige Ganzzahl akzeptiert .

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>

Sherlock9
quelle
5
Einige bestehende Antworten gehen davon aus 0 <= q < n. Sie sollten wahrscheinlich klären, ob dies eine akzeptable Annahme ist.
Peter Taylor
1
Ich hätte mir gewünscht , qund nzwei beliebige ganze Zahlen zu sein, aber so breche ich nicht vorhandenen Antworten,0 <= q < n
Sherlock9
2
In diesem Fall hätte ich es für sinnvoll gehalten, die vorhandenen Antworten mit der Begründung zu "brechen", dass sie nicht den vorhandenen Spezifikationen entsprechen, und Sie haben nur klargestellt, dass dies bedeutet, was gesagt wird, anstatt es zu ändern, aber es ist jetzt zu spät.
Peter Taylor
Sie könnten einen kleinen Bonus für Lösungen geben, die beliebige akzeptierenq
Bakuriu

Antworten:

6

Pyth, 9 Bytes

}Em%*ddQQ

Probieren Sie es online aus: Demo oder Test Suite

Erläuterung:

}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
Jakube
quelle
Ich habe versucht, 7 9 als Eingaben zu setzen, und es stand "False", obwohl 7 5 ^ 2 mod 9 entspricht.
Nick Matteo
@kundor Ich habe die ganzen Zahlen in umgekehrter Reihenfolge gelesen. Erst nund dann q. Also 9\n7als Eingabe probieren .
Jakube,
8

Mathematica, 25 Bytes

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

Mathematica hat als Mathematica natürlich eine eingebaute Funktion zum Berechnen von Modulo-n-ten Wurzeln über PowerMod. Wenn eine Lösung vorhanden ist, wird die kleinste mögliche Lösung zurückgegeben, andernfalls der ursprüngliche Ausdruck (plus eine Nachricht).

Um eine tatsächliche Wahrheits- / Falschausgabe zu erhalten, übergeben wir das Ergebnis an AtomQ, das prüft, ob ein Ausdruck zerlegt werden kann. Ganzzahlen sind atomar und kehren zurück True, während die nichtatomaren PowerMod[q,1/2,n]zurückkehrenFalse

Vielen Dank an @ MartinBüttner für Golftipps und die Funktionsjagd mit mir.

Sp3000
quelle
Dumme Argumente bestellen
CalculatorFeline
Was?! Ich hätte nie gedacht, dass ich PowerModein gebrochenes Argument führen könnte!
Greg Martin
8

Par , 11 9 Bytes

✶X[²x%)↔,

Jedes Zeichen verwendet nur ein Byte. siehe hier .

Erläuterung

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

Zwei Bytes dank Jakube entfernt.

Ypnypn
quelle
5

Haskell, 31 Bytes

3 Bytes gespart dank Martin Büttner.

q#n=elem q[mod(x^2)n|x<-[1..n]]
Alephalpha
quelle
1
Auch 31 Bytes: q#n=any(\x->mod(x*x)n==q)[0..n]und für 30 Bytes: q#n=[x|x<-[0..n],mod(x*x)n==q]Gibt die Liste mit x / leeren Listen anstelle von True / False zurück.
nimi
5

Matlab, 29

Diese Funktion quadriert alle Zahlen von 0 bis n und prüft, ob ein Quadrat minus q Null mod n ist.

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

Prolog (SWI), 34 Bytes

Code:

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

Erläuterung:
Überprüft , ob ein beliebiges Feld zwischen 0 und N Blättern Q , wenn es durch unterteilt N .

Beispiel:

3*8.
false

15*22.
true

Probieren Sie es hier online aus

Emigna
quelle
4

CJam, 11 Bytes

{_,2f#\f%&}

Dieser unbenannte Block erwartet q nauf dem Stapel und [q]verbleibt als wahrer Wert oder ""als falscher Wert auf dem Stapel .

Teste es hier.

Danksagung an Sp3000, die ebenfalls auf diese Lösung gekommen sind, sich aber nicht die Mühe machen konnten, sie zu veröffentlichen.

Erläuterung

_,  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).
Martin Ender
quelle
4

J 9 Bytes

e.]|i.^2:

Verwendung:

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

Erläuterung:

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

Einige J-Mechaniker-Trivia:

Funktionen werden iterativ von rechts nach 3 gruppiert, und wenn wie in unserem Fall ( e. (] | (i. ^ 2:))) noch eine übrig ist , wird der gruppierte Teil mit dem rechten Argument ( N) und die ausgelassene Funktion ( e., "enthält") mit dem ursprünglichen linken aufgerufen Argument ( Q) und das Ergebnis des gruppierten Teils.

( e.]|i.*i.und e.]|2^~i.löst auch das Problem mit gleicher Länge.)

Probieren Sie es hier online aus.

randomra
quelle
3

Mathematica, 27 Bytes

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

Verwendung:

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

Out[1]= True
Alephalpha
quelle
3

Javascript ES6, 42 Bytes

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

Credits an @apsilers für ernsthafte Bytes gespeichert!

Mama Fun Roll
quelle
Wie lautet die ...ArraySyntax? Ich verstehe es immer noch nicht.
Tomáš Zato - Wiedereinsetzung von Monica
Hoffe, diese Änderung ist besser für Sie.
Mama Fun Roll
[...Array(5)]erzeugt Array von undefined, wie Array(5)allein. Ich bin total verwirrt, weil das Entfernen der seltsamen Syntax und das Verwenden nur Array(5)den Code kaputt macht. Gibt es dafür Unterlagen? Screenshot meiner Konsole
Tomáš Zato - Monica
1
@ TomášZato Array(5)ist ein Array ohne eigene Eigenschaften außer length. Die Array-Verteilung [...x]füllt fehlende numerische Eigenschaften bis auf aus length. Die mapFunktion kann nur auf vorhandene Eigenschaften angewendet werden, die Array(5)allein nicht vorhanden sind. Versuchen Sie zum Beispiel Array(5).hasOwnProperty(0)(falsch) gegen [...Array(5)].hasOwnProperty(0)(wahr).
Apsillers
1
Außerdem ist die Verwendung somekürzer und (wie ich finde) gleichwertig:(q,n)=>[...Array(n)].some((x,y)=>y*y%n==q)
apsillers
2

Im Ernst , 20 Bytes

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

Nimmt Eingaben in zwei Zeilen vor:, qdann n. Gibt ein 0if aus, qdas kein quadratischer Rest von ist n, andernfalls eine positive Zahl, die angibt, wie viele xin [1, q](einschließlich) erfüllt sind x^2 = q (mod n).

Probieren Sie es online aus (Permalinks haben weitere Probleme, aber Sie können den Code in der Zwischenzeit kopieren und in eine leere Seite einfügen. )

Erläuterung:

,;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
Mego
quelle
2

Python 3, 41 40 Bytes

Nimmt qund nund bestimmt, ob qin einer Liste von Quadraten von 0Quadrat zu n-1Quadrat steht.

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

Ruby, 33 31 Bytes

Zwei Bytes dank Vasu Adari gespart.

->q,n{(1..n).any?{|e|e*e%n==q}}

Wie immer wird Ruby keine der Golfsprachen schlagen, aber es macht hier eine gute Figur.

Setzen Sie Monica iamnotmaynard wieder ein
quelle
Sie können die Klammern verlieren und es machen ->q,n{}.
Vasu Adari
@ VasuAdari Cool, das wusste ich nicht. Vielen Dank.
Setzen Sie Monica iamnotmaynard
1

Julia, 30 Bytes

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

Dies ist eine Funktion f, die zwei Ganzzahlen akzeptiert und einen Booleschen Wert zurückgibt.

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
Alex A.
quelle
1

JavaScript (ES6), 43 Byte

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

Erläuterung

(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

Prüfung

user81655
quelle
Dies ist eine sehr interessante Sicht auf die Wahrheits- / Falschbedingung @ user81655. Ausgezeichnete Arbeit!
Sherlock9
1

𝔼𝕊𝕄𝕚𝕟 13 Zeichen / 25 Byte

⟦Ѧí]ĉ⇀_²%í≔î)

Try it here (Firefox only).

Mama Fun Roll
quelle
1
Ich habe deinen Code mit getestet 15 22und es stand false.
Sherlock9
@ Sherlock9 behoben.
Mama Fun Roll
Keine benutzerdefinierte Codepage? Dies ist keine Golfsprache!
CalculatorFeline
Es gibt jetzt, aber die Codepage wurde lange nach der Herausforderung erstellt.
Mama Fun Roll
1

Japt, 10 Bytes

Vo d_²%V¥U

Mein erster offizieller Japt Golf aller Zeiten! Vielen Dank an @ETHProductions für das Speichern eines Bytes!

Ungolfed / Erklärung

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

Probieren Sie es online!

Mama Fun Roll
quelle
1
Nett! Hinweis: 0oVentspricht Vo.
ETHproductions
Wusste das nicht. Vielen Dank!
Mama Fun Roll
0

C # 6 (.Net Framework 4.6) in LinqPad, 60 Bytes

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

Milchstraße 1.0.2 , 41 Bytes

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

Dies erwartet qund nbefindet sich ausschließlich auf dem Stack. Es gibt ein 1oder 0für die Wahrheit und falsche Werte aus.

Zach Gates
quelle