q是n的二次残基吗?


22

给定两个输入,q n确定是否q为的二次余数n

也就是说,有一个x地方x**2 == q (mod n)或者是q一个方形模n

输入项

两个整数qand n,其中qn是任意整数0 <= q < n

输出量

真实或错误。

可选,打印任何(或全部)xx**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
我希望q并且n可以是任意两个整数,但是我不会破坏现有的答案,0 <= q < n
Sherlock9

2
在这种情况下,我认为“打破”现有答案是合理的,理由是它们没有遵循现有规范,而您只是在澄清它的意思而不是更改它,但是现在为时已晚。
彼得·泰勒

您可以为接受任意解决方案提供少量奖励q
Bakuriu 2015年

Answers:


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模9.
尼克利玛

@kundor我以相反的顺序读取整数。首先n和比q。因此,请尝试9\n7作为输入。
雅库布2015年

8

Mathematica,25个字节

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

Mathematica是Mathematica,自然有一个内置函数,可以通过计算n模根PowerMod。如果存在解,则返回最小的可行解,否则返回原始表达式(加上一条消息)。

为了获得真实的真实/虚假输出,我们将结果传递给AtomQ,以检查表达式是否可以分解。整数是原子的returning True,而非原子的PowerMod[q,1/2,n]returnFalse

感谢@MartinBüttner给我的高尔夫技巧和功能狩猎。


愚蠢的参数排序
CalculatorFeline

什么?!我不知道PowerMod可以接受一些争论!
格雷格·马丁

8

Par11 9字节

✶X[²x%)↔,

每个字符仅使用一个字节。看这里

说明

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

感谢Jakube删除了两个字节。



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]返回x /空列表的列表,而不是True / False。
nimi 2015年

5

Matlab,29岁

此函数对从0到n的所有数字求平方,并检查平方减去q是否为零模n。

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

4

Prolog(SWI),34个字节

码:

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

说明:
如果检查之间的任何平方0ÑQ当除以Ñ

例:

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进行迭代分组,如果左边有一个,如在我们的案例(e. (] | (i. ^ 2:)))中,则分组的部分使用右参数(N)调用,而遗漏的函数(e.,“ contains”)则用原始的左边调用参数(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语法是什么?我还是不明白。
托马什Zato -恢复莫妮卡

希望此编辑对您更好。
Mama Fun

[...Array(5)]产生的数组undefined,与Array(5)单独数组相同。我完全感到困惑,因为删除奇怪的语法并使用只会Array(5)破坏代码。是否有任何相关文档?我的控制台屏幕截图
托马什Zato -恢复莫妮卡

1
@TomášZato Array(5)是一个数组,除之外没有其他属性length。数组展开可[...x]填充缺少的数字属性,最大可达length。该map函数只能对现有属性进行操作,而Array(5)仅此一项没有。例如,尝试Array(5).hasOwnProperty(0)(false)与[...Array(5)].hasOwnProperty(0)(true)。
apsillers 2015年

1
此外,使用some时间更短,并且(我认为)等效:(q,n)=>[...Array(n)].some((x,y)=>y*y%n==q)
apsillers

2

认真地,20个字节

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

接受两行输入:q,然后输入n。输出0if q是否不是的二次余数n,否则输出一个正数,表示xin [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)]


1

朱莉娅,30个字节

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

这是一个f接受两个整数并返回布尔值的函数。

取消高尔夫:

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的真实/错误条件非常有趣。优秀作品!
Sherlock15年


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

不知道 谢谢!
Mama Fun Roll

0

LinqPad中的C#6(.Net Framework 4.6),60字节

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.