Qa è residuo quadratico di n?


22

Dati due input q ndeterminano se qè un residuo quadratico di n.

Cioè, c'è un xdove x**2 == q (mod n)o è quna mod quadrata n?

Ingresso

Due numeri interi qe n, dove qe nsono numeri interi 0 <= q < n.

Produzione

Una verità o una falsità.

Facoltativamente, stampa qualsiasi (o tutto) xche siax**2 == q (mod n)

Esempi

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

Regole

Il tuo codice deve essere un programma o una funzione. Gli ingressi possono essere in qualsiasi ordine. Questo è il codice golf, quindi vince il codice più breve in byte.

Se qualcosa non è chiaro o deve essere riparato, per favore fatemelo sapere.

bonus

  • Bonus a 2 byte se la tua funzione accetta qcome qualsiasi numero intero arbitrario.

Catalogare

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
Alcune risposte esistenti lo presuppongono 0 <= q < n. Probabilmente dovresti chiarire se questo è un presupposto accettabile.
Peter Taylor,

1
Mi sarebbe piaciuto qe ndi essere qualsiasi due numeri interi, ma in modo da non rompere le risposte esistenti,0 <= q < n
Sherlock9

2
In questo caso avrei ritenuto ragionevole "infrangere" le risposte esistenti sulla base del fatto che non stavano seguendo le specifiche esistenti e stavi solo chiarendo che significava quello che diceva piuttosto che cambiarlo, ma ormai è troppo tardi.
Peter Taylor,

Potresti dare un piccolo bonus per soluzioni che accettano arbitrariamenteq
Bakuriu

Risposte:


6

Pyth, 9 byte

}Em%*ddQQ

Provalo online: dimostrazione o suite di test

Spiegazione:

}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

Ho provato a mettere 7 9 come input, e ha detto "False", nonostante il fatto che 7 sia equivalente a 5 ^ 2 mod 9.
Nick Matteo

@kundor Ho letto gli interi in ordine inverso. Prima ne poi q. Quindi prova 9\n7come input.
Jakube,

8

Mathematica, 25 byte

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

Mathematica, essendo Mathematica, ha naturalmente un built-in per il calcolo delle radici del modulo nth, via PowerMod. Se esiste una soluzione, viene restituita la soluzione più piccola possibile, altrimenti l'espressione originale (più un messaggio).

Per ottenere un output vero / falso passiamo il risultato AtomQ, che controlla se un'espressione può essere scomposta. I numeri interi sono atomici, di ritorno True, mentre i PowerMod[q,1/2,n]ritorni non atomiciFalse

Grazie a @ MartinBüttner per i suggerimenti sul golf e la funzione di caccia con me.


Stupida ordinazione degli argomenti
CalculatorFeline

Che cosa?! Non ho mai saputo che PowerModpotesse prendere una discussione frazionaria!
Greg Martin,

8

Par , 11 9 byte

✶X[²x%)↔,

Ogni personaggio usa solo un byte; vedi qui .

Spiegazione

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

Rimossi due byte grazie a Jakube.



5

Haskell, 31 byte

Salvato 3 byte grazie a Martin Büttner.

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

1
Anche 31 byte: q#n=any(\x->mod(x*x)n==q)[0..n]e per 30 byte: q#n=[x|x<-[0..n],mod(x*x)n==q]che restituisce l'elenco di x / elenco vuoto anziché Vero / Falso.
nimi,

5

Matlab, 29

Questa funzione fa quadrare tutti i numeri da 0 a n e controlla se un quadrato meno q è zero mod n.

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

4

Prolog (SWI), 34 byte

Codice:

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

Spiegazione:
Controlla se ogni quadrato tra 0 e N foglie Q quando diviso per N .

Esempio:

3*8.
false

15*22.
true

Provalo online qui


4

CJam, 11 byte

{_,2f#\f%&}

Questo blocco senza nome si aspetta q nin pila e lascia [q]in pila come valore di verità o ""come valore di falsa.

Provalo qui.

Riconoscimenti a Sp3000 che ha anche escogitato questa soluzione ma "non è stato possibile disturbare la pubblicazione".

Spiegazione

_,  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 byte

e.]|i.^2:

Uso:

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

Spiegazione:

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

Alcune curiosità sulla meccanica J:

Le funzioni sono raggruppate per 3 iterativamente da destra e se ce n'è una a sinistra, come nel nostro caso ( e. (] | (i. ^ 2:))), la parte raggruppata viene chiamata con l'argomento right ( N) e la funzione left out ( e., "contiene") chiamata con la sinistra originale argomento ( Q) e il risultato della parte raggruppata.

( e.]|i.*i.e e.]|2^~i.risolve anche il problema con la stessa lunghezza.)

Provalo online qui.


3

Mathematica, 27 byte

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

Uso:

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

Out[1]= True

3

Javascript ES6, 42 byte

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

Crediti a @apsiler per byte gravi salvati!


Qual è la ...Arraysintassi? Ancora non capisco.
Tomáš Zato - Ripristina Monica il

Spero che questa modifica sia migliore per te.
Mama Fun Roll

[...Array(5)]produce array di undefined, uguale a Array(5)solo. Sono totalmente confuso, perché la rimozione della strana sintassi e l'utilizzo Array(5)interrompe il codice. C'è della documentazione per questo? screenshot della mia console
Tomáš Zato - Ripristina Monica il

1
@ TomášZato Array(5)è un array senza proprietà proprie tranne length. L'array-spread [...x]riempie fino a proprietà numeriche mancanti length. La mapfunzione può operare solo su proprietà esistenti, che Array(5)da sole non ha. Ad esempio, prova Array(5).hasOwnProperty(0)(falso) contro [...Array(5)].hasOwnProperty(0)(vero).
apsillers,

1
Inoltre, l'utilizzo someè più breve e (penso) equivalente:(q,n)=>[...Array(n)].some((x,y)=>y*y%n==q)
apsillers il

2

Scherzi a parte , 20 byte

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

Accetta input su due righe:, qquindi n. Emette un 0if se qnon è un residuo quadratico di n, altrimenti un numero positivo che rappresenta quanti xin [1, q](inclusivo) soddisfano x^2 = q (mod n).

Provalo online (i permalink hanno più problemi, ma nel frattempo puoi copiare e incollare il codice in una pagina vuota )

Spiegazione:

,;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 byte

Prende qe ndetermina se si qtrova in un elenco di quadrati da 0quadrati a n-1quadrati.

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


1

Julia, 30 byte

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

Questa è una funzione fche accetta due numeri interi e restituisce un valore booleano.

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

Spiegazione

(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

Test


Questa è una versione molto interessante della condizione di verità / falsità @ user81655. Lavoro eccellente!
Sherlock9,


1

Japt, 10 byte

Vo d_²%V¥U

Il mio primo golf Japt ufficiale di sempre! Grazie a @ETHProductions per aver salvato un byte!

Ungolfed / Spiegazione

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

Provalo online!


1
Bello! Suggerimento: 0oVè equivalente a Vo.
ETHproductions

Non lo sapevo. Grazie!
Mama Fun Roll

0

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

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

0

Via Lattea 1.0.2 , 41 byte

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

Questo si aspetta qe nsarà solo in pila. Produce rispettivamente a 1o 0per la verità e valori falsi.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.