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>


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

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.


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.



5

Haskell, 31 Bytes

3 Bytes gespart dank Martin Büttner.

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

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))

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


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

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.


3

Mathematica, 27 Bytes

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

Verwendung:

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

Out[1]= True

3

Javascript ES6, 42 Bytes

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

Credits an @apsilers für ernsthafte Bytes gespeichert!


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

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)]


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

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


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


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!


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

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.



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.