Là qa dư bậc hai của n?


22

Cho hai đầu vào q nxác định nếu qlà dư lượng bậc hai của n.

Đó là, có một xnơi x**2 == q (mod n)hoặc là qmột mod vuông n?

Đầu vào

Hai số nguyên qn, ở đâu qnlà bất kỳ số nguyên nào 0 <= q < n.

Đầu ra

Một sự thật hoặc một con chim ưng.

Tùy chọn, in bất kỳ (hoặc tất cả) xđó làx**2 == q (mod n)

Ví dụ

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

Quy tắc

Mã của bạn phải là một chương trình hoặc một chức năng. Các đầu vào có thể theo thứ tự bất kỳ. Đây là mã golf, vì vậy mã ngắn nhất trong byte thắng.

Nếu bất cứ điều gì không rõ ràng hoặc cần sửa chữa, xin vui lòng cho tôi biết.

Tiền thưởng

  • Phần thưởng 2 byte nếu hàm của bạn chấp nhận qlà bất kỳ số nguyên tùy ý nào.

Mục lục

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
Một số câu trả lời hiện có đang giả định rằng 0 <= q < n. Bạn có lẽ nên làm rõ liệu đây có phải là một giả định chấp nhận được hay không.
Peter Taylor

1
Tôi muốn có qnlà bất kỳ hai số nguyên nào, nhưng vì vậy tôi không phá vỡ các câu trả lời hiện có,0 <= q < n
Sherlock9

2
Trong trường hợp này, tôi đã coi việc hợp lý là "phá vỡ" các câu trả lời hiện có với lý do họ không tuân theo thông số kỹ thuật hiện có và bạn chỉ làm rõ rằng nó có nghĩa là những gì nó nói thay vì thay đổi nó, nhưng giờ đã quá muộn.
Peter Taylor

Bạn có thể cho một phần thưởng nhỏ cho các giải pháp chấp nhận tùy ýq
Bakuriu

Câu trả lời:


6

Bình thường, 9 byte

}Em%*ddQQ

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

}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

Tôi đã thử đặt 7 9 làm đầu vào và thông báo "Sai", mặc dù thực tế là 7 tương đương với 5 ^ 2 mod 9.
Nick Matteo

@kundor Mình đọc số nguyên theo thứ tự đảo ngược. Đầu tiên nvà hơn thế qnữa. Vì vậy, hãy thử 9\n7làm đầu vào.
Jakube

8

Toán học, 25 byte

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

Mathicala, là Mathicala, tự nhiên có một tích hợp để tính toán các gốc thứ n của modulo, thông qua PowerMod. Nếu một giải pháp tồn tại, giải pháp khả thi nhỏ nhất được trả về, nếu không thì biểu thức ban đầu (cộng với một thông báo).

Để có được một đầu ra trung thực / giả mạo thực tế, chúng tôi chuyển kết quả đến AtomQ, kiểm tra xem một biểu thức có thể được chia nhỏ hay không. Số nguyên là nguyên tử, trở về True, trong khi PowerMod[q,1/2,n]lợi nhuận không nguyên tửFalse

Cảm ơn @ MartinBüttner về các mẹo chơi gôn và chức năng săn bắn với tôi.


Thứ tự lập luận ngu ngốc
Máy

Gì?! Tôi không bao giờ biết PowerModcó thể có một cuộc tranh cãi phân số!
Greg Martin

8

Mệnh , 11 9 byte

✶X[²x%)↔,

Mỗi ký tự chỉ sử dụng một byte; thấy ở đây .

Giải trình

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

Đã xóa hai byte nhờ Jakube.



5

Haskell, 31 byte

Đã lưu 3 byte nhờ Martin Büttner.

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

1
Ngoài ra 31 byte: q#n=any(\x->mod(x*x)n==q)[0..n]và cho 30 byte: q#n=[x|x<-[0..n],mod(x*x)n==q]trả về danh sách x / danh sách trống thay vì True / false.
nimi

5

Matlab, 29

Hàm này bình phương tất cả các số từ 0 đến n và kiểm tra xem một hình vuông trừ q có bằng không mod n không.

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

4

Prolog (SWI), 34 byte

Mã số:

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

Giải thích:
Kiểm tra nếu có vuông giữa 0NQ khi chia cho N .

Thí dụ:

3*8.
false

15*22.
true

Dùng thử trực tuyến tại đây


4

CJam, 11 byte

{_,2f#\f%&}

Khối không tên này mong đợi q ntrên ngăn xếp và để lại [q]trên ngăn xếp như một giá trị trung thực hoặc ""là một giá trị giả.

Kiểm tra nó ở đây.

Tín dụng cho Sp3000, người cũng đã đưa ra giải pháp này nhưng "không thể bị làm phiền khi đăng".

Giải trình

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

Sử dụng:

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

Giải trình:

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

Một số câu đố cơ học J:

Các hàm được nhóm theo 3 lần lặp từ bên phải và nếu có một bên trái, như trong trường hợp của chúng tôi ( e. (] | (i. ^ 2:))), phần được nhóm được gọi với đối số bên phải ( N) và chức năng bên trái ( e., "chứa") được gọi với bên trái ban đầu đối số ( Q) và kết quả của phần được nhóm.

( e.]|i.*i.e.]|2^~i.cũng giải quyết vấn đề với cùng độ dài.)

Hãy thử trực tuyến tại đây.


3

Toán học, 27 byte

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

Sử dụng:

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)

Tín dụng cho @apsilers cho các byte nghiêm trọng được lưu!


Là gì ...Arraycú pháp? Tôi vẫn không hiểu.
Tomáš Zato - Tái lập lại

Hy vọng chỉnh sửa này là tốt hơn cho bạn.
Mama Fun Roll

[...Array(5)]sản xuất mảng undefined, giống như Array(5)một mình. Tôi hoàn toàn bối rối, bởi vì loại bỏ cú pháp kỳ lạ và sử dụng chỉ Array(5)phá vỡ mã. Có tài liệu nào cho việc này không? Ảnh chụp màn hình bảng điều khiển của tôi
Tomáš Zato - Tái lập Monica

1
@ TomášZato Array(5)là một mảng không có thuộc tính riêng ngoại trừ length. Các mảng trải rộng [...x]trong các thuộc tính số bị thiếu lên đến length. Các mapchức năng chỉ có thể hoạt động trên bất động sản còn tồn tại, mà Array(5)mình không có. Ví dụ: thử Array(5).hasOwnProperty(0)(sai) so với [...Array(5)].hasOwnProperty(0)(đúng).
apsillers

1
Ngoài ra, việc sử dụng somengắn hơn và (tôi nghĩ) tương đương:(q,n)=>[...Array(n)].some((x,y)=>y*y%n==q)
apsillers

2

Nghiêm túc , 20 byte

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

Đưa đầu vào vào hai dòng : q, sau đó n. Đầu ra a 0nếu qkhông phải là phần dư bậc hai n, nếu không, một số dương biểu thị có bao nhiêu xtrong [1, q](bao gồm) thỏa mãn x^2 = q (mod n).

Dùng thử trực tuyến (permalinks đang gặp nhiều vấn đề hơn, nhưng bạn có thể sao chép và dán mã vào một trang trống trong thời gian này)

Giải trình:

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

Đưa qnxác định xem qcó nằm trong danh sách các ô vuông từ 0bình phương đến n-1bình phương không.

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]

Đây là một hàm fchấp nhận hai số nguyên và trả về một boolean.

Ung dung:

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

Giải trình

(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

Kiểm tra


Đây là một điều rất thú vị về điều kiện trung thực / falsey @ user81655. Làm tốt lắm
Sherlock9


1

Japt, 10 byte

Vo d_²%V¥U

Golf Japt chính thức đầu tiên của tôi từ trước đến giờ! Cảm ơn @ETH Productstions đã lưu một byte!

Ungolfed / Giải thích

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

Hãy thử trực tuyến!


1
Tốt đẹp! Gợi ý: 0oVtương đương với Vo.
Sản xuất ETH

Không biết điều đó. Cảm ơn!
Mama Fun Roll

0

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

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

0

Dải ngân hà 1.0.2 , 41 byte

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

Điều này mong đợi qnchỉ được duy nhất trên stack. Nó xuất ra một 1hoặc 0cho các giá trị thật và sai tương ứng.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.