qaはnの2次剰余ですか?


22

与えられた2つの入力が以下をq n決定するqと、が2次剰余であるがnます。

つまり、正方形のmod はxどこにありますx**2 == q (mod n)qnますか?

入力

2つの整数qおよびn、ここでqおよびnは任意の整数です0 <= q < nです。

出力

真実か偽か。

オプションで、以下のいずれか(またはすべて)xを印刷しますx**2 == q (mod n)

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

ルール

コードはプログラムまたは関数でなければなりません。入力は任意の順序にすることができます。これはコードゴルフであるため、バイト単位の最短コードが優先されます。

不明な点がある場合や修正が必要な場合は、お知らせください。

ボーナス

  • 関数がq任意の整数として受け入れる場合の2バイトのボーナス。

カタログ

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
いくつかの既存の答えはそれを仮定してい0 <= q < nます。おそらく、これが許容できる仮定であるかどうかを明確にする必要があります。
ピーターテイラー

1
私が好きだろうqn、任意の二つの整数である、しかし、私は、既存の答えを壊さない0 <= q < n
Sherlock9

2
この場合、既存の仕様に従っていないという理由で既存の回答を「破る」のが合理的であると考え、変更するのではなく言ったことを意味していることを明確にしたが、今は遅すぎます。
ピーターテイラー

あなたがq
arbitrary意

回答:


6

Pyth、9バイト

}Em%*ddQQ

オンラインで試す:デモンストレーションまたはテストスイート

説明:

}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

私は、入力として7〜9を入れてみました、そして、それは7が5 ^ 2のmod 9と同等であるという事実にもかかわらず、「偽」と述べた
ニック・マッテオ

@kundor整数を逆順で読みます。最初nとよりq9\n7入力として試してください。
ジャクベ

8

Mathematica、25バイト

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

MathematicaはMathematicaであり、当然、を介してモジュロn根を計算するための組み込み関数を持っていPowerModます。ソリューションが存在する場合、実行可能な最小のソリューションが返され、そうでない場合は元の式(およびメッセージ)が返されます。

実際の真実/偽の出力を取得するには、結果をに渡しAtomQます。これにより、式を分解できるかどうかがチェックされます。整数はアトミックでTrue、をPowerMod[q,1/2,n]返しますが、非アトミックは返しますFalse

@MartinBüttnerにゴルフのヒントと機能のハンティングをありがとう。


愚かな引数の順序
CalculatorFeline

何?!PowerMod分数の引数を取ることができるとは知らなかった!
グレッグマーティン

8

Par11 9バイト

✶X[²x%)↔,

各文字は1バイトのみを使用します。こちらをご覧ください

説明

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

Jakubeのおかげで2バイト削除されました。



5

Haskell、31バイト

MartinBüttnerのおかげで3バイト節約されました。

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

1
また、31バイト:q#n=any(\x->mod(x*x)n==q)[0..n]および30バイトの場合:q#n=[x|x<-[0..n],mod(x*x)n==q]True / Falseの代わりにx /空リストのリストを返します。
nimi

5

Matlab、29

この関数は、0からnまでのすべての数値を2乗し、2乗からqを引いた値がゼロmod nかどうかを確認します。

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

4

プロローグ(SWI)、34バイト

コード:

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

説明:
チェック間のいずれかの正方形の場合は0NはQをで割ったときにN

例:

3*8.
false

15*22.
true

こちらからオンラインでお試しください


4

CJam、11バイト

{_,2f#\f%&}

この名前のないブロックはq nスタック上にあることを期待し、[q]真実の値としてスタックに残します""ます。

ここでテストしてください。

このソリューションも思いついたSp3000に感謝しますが、「面倒な投稿はできませんでした」。

説明

_,  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バイト

e.]|i.^2:

使用法:

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

説明:

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

いくつかのJメカニズムのトリビア:

関数は右から3ずつ繰り返しグループ化され、左に1つがある場合(この場合のようにe. (] | (i. ^ 2:)))()、グループ化された部分は右の引数(N)で呼び出され、左の関数(e.、「含む」)は元の左で呼び出されます引数(Q)およびグループ化された部分の結果。

e.]|i.*i.そしてe.]|2^~i.また、同じ長さの問題を解決します。)

こちらからオンラインでお試しください。


3

Mathematica、27バイト

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

使用法:

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

Out[1]= True

3

Javascript ES6、42バイト

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

深刻なバイト数を節約した@apsilersへのクレジット!


...Array構文は何ですか?まだわかりません。
トマーシュザト-復帰モニカ

この編集があなたにとって良いことを願っています。
ママファンロール

[...Array(5)]配列生成undefinedと同じ、Array(5)単独で。奇妙な構文を削除して使用Array(5)するとコードが壊れるだけなので、完全に混乱しています。これに関するドキュメントはありますか?私のコンソールのスクリーンショット
トマシュ・ザト-モニカの復活

1
@TomášZato Array(5)は、を除くown-propertiesのない配列lengthです。配列スプレッド[...x]は、不足している数値プロパティを最大で埋めlengthます。このmap関数は既存のプロパティでのみ動作できますが、それArray(5)だけでは機能しません。たとえば、Array(5).hasOwnProperty(0)(false)対[...Array(5)].hasOwnProperty(0)(true)を試してください。
アプシラーズ

1
また、使用someはより短く、(私が思うに)同等です:(q,n)=>[...Array(n)].some((x,y)=>y*y%n==q)
apsillers

2

真剣に、20バイト

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

2行で入力を受け取ります:q、そしてn。出力0場合qの平方剰余ではありませんn、どのように多くの表す他の正の数x[1, q](包括的)を満たしますx^2 = q (mod n)

オンラインで試してみてください(パーマリンクにはさらに問題がありますが、コードをコピーして空白のページに貼り付けることができます、その間にに)

説明:

,;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バイト

受け取りqnし、かどうかを判断するqから正方形のリストである0乗にn-1乗。

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

2

ルビー、33 31バイト

Vasu Adariのおかげで2バイト節約できました。

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

いつものように、Rubyはゴルフ言語を打ち負かすつもりはありませんが、ここでは良いショーになります。


中かっこを失い、作ることができます->q,n{}
ヴァスアダリ

@VasuAdariクール、私はそれを知りませんでした。ありがとうございました。
モニカiamnotmaynardを

1

ジュリア、30バイト

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

これは、f2つの整数を受け入れてブール値を返す関数です。

ゴルフをしていない:

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バイト

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

説明

(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

テスト


これは@ user81655の真偽条件に関する非常に興味深い見解です。すばらしい仕事です!
Sherlock9

1

𝔼𝕊𝕄𝕚𝕟、13文字/ 25バイト

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

Try it here (Firefox only).


1
私はあなたのコードをテストし15 22、それは言ったfalse
Sherlock9

@ Sherlock9修正済み。
ママファンロール

カスタムコードページはありませんか?これはゴルフの言語ではありません!
電卓

現在ありますが、コードページはチャレンジのかなり後に作成されました。
ママファンロール

1

Japt、10バイト

Vo d_²%V¥U

初めての公式ゴルフJapt!バイトを保存してくれた@ETHProductionsに感謝します!

未ゴルフ/説明

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

オンラインでお試しください!


1
いいね!ヒント:0oVと同等Voです。
ETHproductions

知らなかった。ありがとう!
ママファンロール


0

天の川1.0.2、41バイト

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

これは期待しqnもっぱらスタック上にあります。これは、出力し1たり0、それぞれのために真実と虚偽の値を。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.