is_gaussian_prime (z)?


23

งาน

เขียนฟังก์ชันที่รับจำนวนเต็มสองจำนวนa,bที่แทนจำนวน Gaussian จำนวนเต็มz = a+ib(จำนวนเชิงซ้อน) โปรแกรมจะต้องกลับมาจริงหรือเท็จขึ้นอยู่กับว่าa+ibเป็นนายกเสียนหรือไม่

ความหมาย:

a + bi คือ Gaussian prime ถ้าหากว่าตรงตามเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้:

  • aและbทั้งสองไม่ใช่ศูนย์และa^2 + b^2เป็นนายก
  • aเป็นศูนย์|b|คือไพร์มและ|b| = 3 (mod 4)
  • bเป็นศูนย์|a|คือไพร์มและ|a| = 3 (mod 4)

รายละเอียด

คุณควรเขียนฟังก์ชั่นเท่านั้น หากภาษาของคุณไม่มีฟังก์ชั่นคุณสามารถสมมติได้ว่าจำนวนเต็มถูกเก็บไว้ในตัวแปรสองตัวแล้วพิมพ์ผลลัพธ์หรือเขียนลงในไฟล์

คุณไม่สามารถใช้ฟังก์ชั่นการใช้ภาษาของคุณชอบisprimeหรือprime_listหรือหรือnthprime factorจำนวนไบต์ต่ำสุดชนะ โปรแกรมต้องทำงานสำหรับa,bที่a^2+b^2เป็นจำนวนเต็ม 32 บิต (ลงนาม) และควรเสร็จในไม่เกิน 30 วินาทีอย่างมีนัยสำคัญ

รายการสำคัญ

จุดต่างๆแสดงตัวเลขจำนวนมากบนระนาบเกาส์เซียน ( x= จริง, y= แกนจินตภาพ):

ป้อนคำอธิบายรูปภาพที่นี่

ช่วงเวลาที่มีขนาดใหญ่กว่า:

(9940, 43833)
(4190, 42741)
(9557, 41412)
(1437, 44090)

2
เราได้รับอนุญาตให้ใช้ฟังก์ชันการแยกตัวประกอบ ( factorใน Bash mfและmFใน CJam, ... )

โอ้ไม่ฉันลืมวิธีการแยกตัวประกอบที่มีอยู่ไม่โปรดไม่ =) และข้อ จำกัด 32 บิตที่ใช้กับ ^ 2 + b ^ 2 จะไม่สมเหตุสมผล ขอบคุณสำหรับอินพุตของคุณ! ฉันอัพเดทคำถาม
ข้อบกพร่อง

2
ฉันเพิ่มคำนิยามของ Gaussian primes ในโพสต์แล้ว หากคุณไม่ชอบวิธีที่ฉันทำมันรู้สึกอิสระที่จะย้อนกลับไป แต่ฉันขอแนะนำให้รวมคำนิยามไว้ที่ใดที่หนึ่ง
undergroundmonorail

ที่ดีฉันเดิมไม่ต้องการชี้ให้เห็นโดยตรงถึงวิธีการกำหนด
ดั่งเดิม

1 1073741857 ดูเหมือนจะไม่ให้ฉันเป็นแบบเกาส์ที่สำคัญเพราะ 1 ^ 2 + 1073741857 ^ 2 เป็นเลขคู่ ...
RosLuP

คำตอบ:


4

Haskell ทั้งหมด - 77/ 108 107 ตัวอักษร

การใช้งาน: ในทั้งสองวิธีการพิมพ์ a% b จะกลับมาว่า + bi เป็น gaussian prime หรือไม่

ต่ำสุดที่ฉันจัดการ แต่ไม่มีความคิดสร้างสรรค์หรือประสิทธิภาพ (77 ตัวอักษร)

p n=all(\x->rem n x>0)[2..n-1]
a%0=rem a 4==3&&p(abs a)
0%a=a%0
a%b=p$a^2+b^2

วิธีการแก้ปัญหานี้เพียงพลังผ่านตัวเลขทั้งหมดด้านล่าง n เพื่อตรวจสอบว่ามันเป็นนายก

เวอร์ชันที่ไม่ถูกปรับแต่ง:

isprime = all (\x -> rem n x != 0) [2..n-1] -- none of the numbers between 2 and n-1 divide n.
isGaussianPrime a 0 = rem a 4==3 && isprime (abs a)
isGaussianPrime 0 a = isGaussianPrime a 0   -- the definition is symmetric
isGaussianPrime a b = isprime (a^2 + b^2)

วิธีแก้ไขปัญหาถัดไปมีคุณสมบัติพิเศษ - การจดบันทึก เมื่อคุณตรวจสอบว่าจำนวนเต็ม n เป็นจำนวนเฉพาะคุณไม่จำเป็นต้องคำนวณ "ความซ้ำซ้อน" ของตัวเลขทั้งหมดที่มีขนาดเล็กกว่าหรือเท่ากับ n เนื่องจากจะถูกเก็บไว้ในคอมพิวเตอร์

(107 ตัวอักษรความคิดเห็นเพื่อความชัดเจน)

s(p:x)=p:s[n|n<-x,rem n p>0] --the sieve function
l=s[2..]                     --infinite list of primes
p n=n==filter(>=n)l!!0       --check whether n is in the list of primes
a%0=rem a 4==3&&p(abs a)
0%a=a%0
a%b=p$a*a+b*b

เวอร์ชันที่ไม่ถูกปรับแต่ง:

primes = sieve [2..] where
    sieve (p:xs) = p:filter (\n -> rem n p /= 0) xs
isprime n = n == head (filter (>=n) primes) -- checks if the first prime >= n is equal to n. if it is, n is prime.
isGaussianPrime a 0 = rem a 4==3 && isprime (abs a)
isGaussianPrime 0 a = isGaussianPrime a 0   -- the definition is symmetric
isGaussianPrime a b = isprime (a^2 + b^2)

นี่ใช้ตะแกรงของ Eratosthenes เพื่อคำนวณรายการอนันต์ของช่วงเวลาทั้งหมด (เรียกว่า l สำหรับรายการในโค้ด) (รายการไม่มีที่สิ้นสุดเป็นเคล็ดลับที่รู้จักกันดีของฮาเซล)

เป็นไปได้อย่างไรที่จะมีรายการไม่สิ้นสุด เมื่อเริ่มต้นโปรแกรมรายการจะถูกประเมินค่าและแทนที่จะจัดเก็บองค์ประกอบรายการคอมพิวเตอร์จะจัดเก็บวิธีการคำนวณ แต่เมื่อโปรแกรมเข้าถึงรายการมันจะประเมินตัวเองตามคำร้องขอเพียงบางส่วน ดังนั้นหากโปรแกรมต้องการขอรายการที่สี่ในรายการคอมพิวเตอร์จะคำนวณช่วงเวลาทั้งหมดที่ไม่ได้รับการประเมินเก็บไว้และส่วนที่เหลือจะไม่มีการประเมินค่าจัดเก็บเป็นวิธีการคำนวณครั้งเดียว จำเป็น

โปรดทราบว่าทั้งหมดนี้มอบให้โดยอิสระโดยธรรมชาติที่ขี้เกียจของภาษา Haskell ไม่มีสิ่งใดที่ชัดเจนจากรหัส

โปรแกรมทั้งสองเวอร์ชันมีการใช้งานมากเกินไปดังนั้นจึงสามารถจัดการกับข้อมูลที่มีขนาดตามอำเภอใจได้


โดยการนับของฉันการแก้ปัญหาแรกของคุณคือ 77 ตัวอักษร: D
killmous

ฉันนับบรรทัดใหม่แล้วไม่ควรฉัน
ภูมิใจ haskeller

ฉันนับ 74 ตัวอักษรปกติและ 3 บรรทัดใหม่
killmous

คุณพูดถูกแล้วดูเหมือนว่า notepad ++ จะเพิ่มตัวละครขึ้นบรรทัดใหม่ ขอบคุณ!
ภูมิใจ Haskeller

นั่นเป็นเหตุผลที่ฉันใช้ประเสริฐ;) ดีใจที่ได้ช่วยเหลือ!
killmous

9

C, 149 118 ตัวอักษร

ฉบับแก้ไข (118 ตัวอักษร):

int G(int a,int b){a=abs(a);b=abs(b);int n=a*b?a*a+b*b:a+b,
d=2;for(;n/d/d&&n%d;d++);return n/d/d|n<2?0:(a+b&3)>2|a*b;}

นี่เป็นฟังก์ชั่นเดียว:

  • G ( a , b ) จะส่งกลับค่าที่ไม่ใช่ศูนย์ (จริง) ถ้าa + biเป็น Gaussian prime หรือ zero (false)

มันพับการทดสอบจำนวนเต็มจำนวนเต็มเป็นนิพจน์ที่n/d/d|n<2ซ่อนอยู่ในการคำนวณค่าส่งคืน รหัส golfed นี้ยังใช้a*bแทนa&&b(ในคำอื่น ๆa!=0 && b!=0) และเทคนิคอื่น ๆ ที่เกี่ยวข้องกับความสำคัญของผู้ประกอบการและการหารจำนวนเต็ม ยกตัวอย่างเช่นn/d/dเป็นวิธีที่สั้นกว่าการพูดn/d/d>=1ซึ่งเป็นวิธีที่ล้นความปลอดภัยในการพูดn>=d*dหรือหรือในสาระสำคัญd*d<=nd<=sqrt(n)


รุ่นดั้งเดิม (149 ตัวอักษร):

int Q(int n){int d=2;for(;n/d/d&&n%d;d++);return n/d/d||n<2;}
int G(int a,int b){a=abs(a);b=abs(b);return!((a|b%4<3|Q(b))*(b|a%4<3|Q(a))*Q(a*a+b*b));}

ฟังก์ชั่น:

  • Q ( n ) ส่งคืน 0 (false) ถ้าnเป็นจำนวนเฉพาะหรือ 1 (จริง) ถ้าnเป็นค่าไม่ใช่ มันเป็นฟังก์ชั่นตัวช่วยสำหรับG ( a , b )

  • G ( a , b ) ส่งคืน 1 (จริง) ถ้าa + biเป็นนายกแบบเกาส์หรือ 0 (เท็จ)

เอาต์พุตตัวอย่าง (ปรับเพิ่มขึ้น 200%) สำหรับ | a |, | b | ≤ 128:

Sample128


2
+1 สำหรับภาพ! คุณอาจจะยังดำเนินการอย่างหนึ่งเกี่ยวกับขนาดเดียวกันเพียง แต่ในด้านแรก (เพราะสมมาตร) จริงๆมันมีลักษณะที่ดีที่นี่ =)
flawr

คุณสามารถบันทึกอักขระได้สองตัวโดยแทนที่ d = 2; สำหรับ (; n / d / d && n% d; d ++); ด้วยสำหรับ (d = 2; n / d / d && n% d ++;);
เล่นแร่แปรธาตุ

@Alchymist - นั่นคือการบันทึกอักขระ แต่สร้างผลลัพธ์ที่ไม่ถูกต้อง สิ่งสำคัญคือการd++ไม่เกิดขึ้นเป็นส่วนหนึ่งของเงื่อนไขมิฉะนั้นจะทำให้เกิดความวุ่นวายตามตรรกะ นอกจากนี้การย้ายd=2ภายในforลูปจะเพิ่มจำนวนตัวอักษรแทนการลดลงเนื่องจากdยังต้องประกาศintก่อนforลูป ฉันพลาดอะไรไปรึเปล่า?
ทอดด์เลห์แมน

จริงเกินไป อันตรายของการดูสิ่งนี้อยู่ห่างจากสภาพแวดล้อมการเข้ารหัสและไม่ใกล้พอ การเพิ่มขึ้นต้องอยู่ในที่ที่เป็นอยู่และการกำหนดค่าเริ่มต้นจะช่วยโซลูชันต้นฉบับของคุณเท่านั้น มีการประหยัดที่ชัดเจนหากคุณประกาศ n & d นอกฟังก์ชั่นโดยไม่ต้องระบุ int และเริ่มต้นพวกเขาในการวนรอบ แต่ฉันคิดว่าคุณจะทำให้ฟังก์ชั่นในตัวเองซึ่งเป็นการตีความข้อกำหนดที่เข้มงวด
เล่นแร่แปรธาตุ

1
การทดสอบที่สำคัญของที่นี่คือการเล่นกอล์ฟที่น่าตื่นเต้น! อย่างไรก็ตามมีความเป็นไปได้ที่จะประหยัดได้มากขึ้นโดยการใส่ตัวระบุชนิด int สำหรับชนิดส่งคืนและอาร์กิวเมนต์โดยใช้ตัวแปรสำหรับ | a | + | b | และเพิ่มประสิทธิภาพคำสั่ง return: G(a,b){int s=abs(a)+abs(b),n=a*b?a*a+b*b:s,d=2;for(;n/d/d&&n%d;d++);return n>1>n/d/d&&s%4/3|a*b;}ออกมาเพียง 97 ตัวอักษร
feersum

4

APL (Dyalog Unicode) , 36 47 48 49 47 43 28 ไบต์

ใช้เวลาสองอาร์เรย์ของจำนวนเต็มและส่งกลับค่าบูลีนของคำสั่งa ba+bi is a Gaussian integer

แก้ไข: +11 ไบต์เนื่องจากฉันเข้าใจผิดนิยามของ Gaussian prime +1 ไบต์จากการแก้ไขคำตอบอีกครั้ง +1 ไบต์จากการแก้ไขข้อบกพร่องที่สาม -2 ไบต์เนื่องจากใช้รถไฟแทน dfn -4 ไบต์ต้องขอบคุณเนื่องจาก NGN เพื่อใช้ยามแทนcondition: if_true ⋄ if_false if_true⊣⍣condition⊢if_false-15 ไบต์ขอบคุณ ngn เนื่องจากการค้นหาวิธีที่แตกต่างอย่างสิ้นเชิงในการเขียนเงื่อนไข - ถ้า - อย่างอื่นเป็นรถไฟเต็ม

{2=≢∪⍵∨⍳⍵}|+.×0∘∊⊃|{⍺⍵}3=4||

ลองออนไลน์!

คำอธิบาย

{2=≢∪⍵∨⍳⍵}|+.×0∘∊⊃|{⍺⍵}3=4||

                           |   abs(a), abs(b) or abs(list)
                       3=4|    Check if a and b are congruent to 3 (mod 4)
                  |{⍺⍵}        Combine with (abs(a), abs(b))
              0∘∊⊃             Pick out the original abs(list) if both are non-zero
                               Else pick out (if 3 mod 4)
          |+.×                 Dot product with abs(list) returns any of
                               - All zeroes if neither check passed
                               - The zero and the number that IS 3 mod 4
                               - a^2 + b^2
{2=≢∪⍵∨⍳⍵}                     Check if any of the above are prime, and return

3

Haskell - 121 ตัวอักษร (รวมบรรทัดใหม่)

นี่เป็นวิธีการแก้ปัญหาที่ค่อนข้างง่ายของ Haskell ที่ไม่ได้ใช้โมดูลภายนอกใด ๆ และสามารถใช้งานได้มากที่สุด

a%1=[]
a%n|n`mod`a<1=a:2%(n`div`a)|1>0=(a+1)%n
0#b=2%d==[d]&&d`mod`4==3where d=abs(b)
a#0=0#a
a#b=2%c==[c]where c=a^2+b^2

เรียกใช้ghci ./gprimes.hsแล้วคุณสามารถใช้มันในเชลล์เชิงโต้ตอบ หมายเหตุ: จำนวนลบเป็นจู้จี้จุกจิกและต้องอยู่ในวงเล็บ กล่าวคือ

*Main>1#1
True
*Main>(-3)#0
True
*Main>2#2
False

3

Python - 121 120 ตัวอักษร

def p(x,s=2):
 while s*s<=abs(x):yield x%s;s+=1
f=lambda a,b:(all(p(a*a+b*b))if b else f(b,a))if a else(b%4>2)&all(p(b))

pตรวจสอบว่าabs(x)มีความสำคัญโดยการวนซ้ำตัวเลขทั้งหมดจาก 2 ถึงabs(x)**.5(ซึ่งเป็นsqrt(abs(x))) มันไม่ได้โดยผลผลิตสำหรับแต่ละx % s จากนั้นตรวจสอบว่าค่าที่ให้ผลทั้งหมดเป็นค่าที่ไม่ใช่ศูนย์และหยุดการสร้างค่าเมื่อพบตัวหารหรือไม่ ใน, แทนที่กรณีสำหรับแรงบันดาลใจจาก@killmous 'Haskell คำตอบsallxff(b,a)b==0


-1 char และ bugfix จาก@PeterTaylor


ดีใจที่ฉันสามารถช่วย :)
23414 killmous

คุณสามารถแทนที่s<abs(x)**.5ด้วยs*s<abs(x)การบันทึก 2 แม้ว่าคุณควรตรวจสอบ<=จริง ๆ ดังนั้นจึงอาจเป็นรถในปัจจุบัน
Peter Taylor

@PeterTaylor ขอขอบคุณสำหรับการชี้ให้เห็นข้อผิดพลาด ...
HLT

f(0,15)อัตราการโทรTypeError: unsupported operand type(s) for &: 'bool' and 'generator'กับล่ามของฉัน :(
Falko

f(0,15)ให้Falseสำหรับฉันทั้งใน 2.7.6 และ 3.4.1 (บน OS X) คุณเป็นเวอร์ชั่นอะไร
hlt

3

Python 2.7 , 341 301 253 ไบต์เหมาะสำหรับความเร็ว

lambda x,y:(x==0and g(y))or(y==0and g(x))or(x*y and p(x*x+y*y))
def p(n,r=[2]):a=lambda n:r+range(r[-1],int(n**.5)+1);r+=[i for i in a(n)if all(i%j for j in a(i))]if n>r[-1]**2else[];return all(n%i for i in r if i*i<n)
g=lambda x:abs(x)%4>2and p(abs(x))

ลองออนไลน์!

#pRimes. need at least one for r[-1]
r=[2]
#list of primes and other to-check-for-primarity numbers 
#(between max(r) and sqrt(n))
a=lambda n:r+list(range(r[-1],int(n**.5)+1))
#is_prime, using a(n)
f=lambda n:all(n%i for i in a(n))
#is_prime, using r
def p(n):
    global r
    #if r is not enough, update r
    if n>r[-1]**2:
        r+=[i for i in a(n) if f(i)]
    return all(n%i for i in r if i*i<n)
#sub-function for testing (0,y) and (x,0)
g=lambda x:abs(x)%4==3 and p(abs(x))
#the testing function
h=lambda x,y:(x==0 and g(y)) or (y==0 and g(x)) or (x and y and p(x*x+y*y))

ขอบคุณ: 40 +48 - การเล่นกอล์ฟทั้งหมดกับ โจคิง


fแลมบ์ดายังเป็น uneccesary พร้อมกับlistโทร ไบต์ 257โดยไม่มีเหล่านั้นรวมถึงการลบช่องว่างบางส่วน นี่อาจจะไม่ได้ผลอีกต่อไป
โจคิง

(15,0) ตอนนี้เป็นจริงในรุ่น 257 ไบต์และเวลาทำงานเพิ่มขึ้น 5.5s ขออภัย
Alexey Burdin

2

Perl - 110 107 105 ตัวอักษร

ฉันหวังว่าฉันปฏิบัติตามคำจำกัดความที่เชื่อมโยงอย่างถูกต้อง ...

sub f{($a,$b)=map abs,@_;$n=$a**(1+!!$b)+$b**(1+!!$a);(grep{$n%$_<1}2..$n)<2&&($a||$b%4>2)&&($b||$a%4>2)}

Ungolfed:

sub f {
  ($a,$b) = map abs, @_;
  $n = $a**(1+!!$b) + $b**(1+!!$a);
  (grep {$n%$_<1} 2..$n)<2 && ($a || $b%4==3) && ($b || $a%4==3)
}

ชี้แจงเพราะมีคนถาม: ผมอ่านข้อโต้แย้ง ( @_) และใส่ค่าที่แน่นอนของพวกเขาลง$a, $bเพราะฟังก์ชั่นไม่จำเป็นต้องเข้าสู่ระบบของพวกเขา แต่ละเกณฑ์ที่ต้องมีการทดสอบ primality หมายเลข แต่หมายเลขนี้ขึ้นอยู่กับว่า$aหรือเป็นศูนย์ซึ่งผมพยายามที่จะแสดงในทางที่สั้นที่สุดและวางใน$b $nในที่สุดฉันจะตรวจสอบว่า$nมีความสำคัญหรือไม่โดยการนับจำนวนระหว่าง 2 และแบ่งตัวเองโดยไม่เหลือ (นั่นคือgrep...<2ส่วน) แล้วตรวจสอบว่าถ้าหนึ่งในจำนวนนั้นเป็นศูนย์แล้วอีกหนึ่งเท่ากับ 3 โมดูโล 4 ฟังก์ชั่น ค่าส่งคืนคือค่าเริ่มต้นของบรรทัดสุดท้ายและเงื่อนไขเหล่านี้ส่งคืนค่าความจริงบางส่วนหากตรงตามเงื่อนไขทั้งหมด


ฉันไม่สามารถใช้พารามิเตอร์เชิงลบได้
killmous

1
@killmous คุณพูดถูกเพียงแค่ซ่อมมัน
Tal

คุณช่วยอธิบายอัลกอริทึมได้มั้ย
ภูมิใจ haskeller

1
ดี! โดยวิธีการที่ผมคิดว่าคุณสามารถโกนตัวละครคู่โดยการเขียนแทน$a%4>2 $a%4==3
ทอดด์เลห์แมน

2

golflua 147 141

จำนวนข้างต้นละเลยบรรทัดใหม่ที่ฉันเพิ่มเพื่อดูฟังก์ชั่นที่แตกต่างกัน แม้จะมีการยืนกรานที่จะไม่ทำเช่นนั้นฉันกำลังดุร้ายแก้ปัญหาเฉพาะในกรณี

\p(x)s=2@s*s<=M.a(x)?(x%s==0)~0$s=s+1$~1$
\g(a,b)?a*b!=0~p(a^2+b^2)??a==0~p(b)+M.a(b)%4>2??b==0~p(a)+M.a(a)%4>2!?~0$$
w(g(tn(I.r()),tn(I.r())))

ส่งคืน 1 ถ้าเป็นจริงและ 0 ถ้าไม่

รุ่น Lua ที่ไม่ร้ายกาจ

-- prime number checker
function p(x)
   s=2
   while s*s<=math.abs(x) do
      if(x%s==0) then return 0 end
      s=s+1
   end
   return 1
end

-- check gaussian primes
function g(a,b)
   if a*b~=0 then
      return p(a^2+b^2)
   elseif a==0 then
      return p(b) + math.abs(b)%4>2
   elseif b==0 then
      return p(a) + math.abs(a)%4>2
   else
      return 0
   end
end


a=tonumber(io.read())
b=tonumber(io.read())
print(g(a,b))

คุณสามารถบันทึกตัวละคร 6 ตัวเพียงแค่เสียบtonumber(io.read())เป็นอาร์กิวเมนต์gในท้ายที่สุดและอีก 2 ตัวโดยการลบบรรทัดใหม่
mniip

@mniip: การขึ้นบรรทัดใหม่ไม่ถูกนับฉันเพิ่งเพิ่มเข้าไปเพื่อความชัดเจน (ไม่มีการเลื่อนด้านข้าง) ฉันจะอัปเดตการอ่านเป็นกรัมเมื่อฉันได้ทำงานเล็กน้อย ขอบคุณ!
Kyle Kanos

มันยังทำงานได้ดีในเวลาที่เหมาะสมสำหรับคนจำนวนมากหรือไม่? ฉันคิดในเบื้องต้นเกี่ยวกับ bruteforcing ในการตรวจสอบจำนวนเต็ม Gaussian ทั้งหมดaซึ่ง|a| <= |z|ถ้าa | z(ถ้าaหารz)
ข้อบกพร่อง

@flawr: ฉันทดสอบด้วย a = 2147483644, b = 896234511 และได้ 0 ในประมาณ 0.002 s ฉันยังทดสอบกับ 2147483629 และ 2147483587 (สองช่วงใหญ่มาก) และได้ 0 ในอีก 0.002 วินาที ฉันกำลังพยายามหาคู่จำนวนมากที่ ^ 2 + b ^ 2 นั้นยอดเยี่ยมและทำให้แน่ใจว่าฉันมีวิธีแก้ปัญหาสำหรับตัวเลขจำนวนมากเช่นนั้น
Kyle Kanos

@flawr: ทดสอบด้วย a = 4600 & b = 5603 (a ^ 2 + b ^ 2 = 2147393609 นั้นสำคัญ & <2 ^ 32-1) และใช้เวลา 0.002 วินาทีเดียวกันในการกลับมา 1. เย้!
Kyle Kanos

1

APL (NARS), 99 ตัวอักษร, 198 ไบต์

r←p w;i;k
r←0⋄→0×⍳w<2⋄i←2⋄k←√w⋄→3
→0×⍳0=i∣w⋄i+←1
→2×⍳i≤k
r←1

f←{v←√k←+/2*⍨⍺⍵⋄0=⍺×⍵:(p v)∧3=4∣v⋄p k}

ทดสอบ:

  0 f 13
0
  0 f 9
0
  2 f 3
1
  3 f 4
0
  0 f 7
1
  0 f 9
0
  4600 f 5603
1  

1

เวทมนตร์รูน 41 ไบต์

>ii:0)?\S:0)?\:*S:*+'PA@
3%4A|'S/;$=?4/?3

ลองออนไลน์!

จบลงด้วยการเป็นเรื่องง่ายกว่าที่ฉันคิดและไม่มีที่ว่างสำหรับการตีกอล์ฟ โปรแกรมต้นฉบับที่ฉันบล็อกคือ:

>ii:0)?\S:0)?\:*S:*+'PA@
3%4A|'S/!   S/;$=

ฉันเล่นไปพร้อมกับพยายามเปรียบเทียบอินพุตทั้งสองในเวลาเดียวกัน (ซึ่งบันทึกทั้งหมด 1 ไบต์) แต่เมื่อนั่นลดลงในส่วน "หนึ่งในนั้นคือศูนย์" ไม่มีวิธีที่ดีที่จะคิดว่ารายการใด ไม่ใช่ศูนย์เพื่อดำเนินการตรวจสอบล่าสุดน้อยกว่าวิธีการทำโดยไม่ต้องใช้อย่างน้อย 1 ไบต์ (ไม่มีการประหยัดโดยรวม)


1

Mathematica, 149 ตัวอักษร

If[a==0,#[[3]]&&Mod[Abs@b,4]==3,If[b==0,#[[2]]&&Mod[Abs@a,4]==3,#[[1]]]]&[(q=#;Total[Boole@IntegerQ[q/#]&/@Range@q]<3&&q!=0)&/@{a^2+b^2,Abs@a,Abs@b}]

รหัสไม่ได้ใช้คุณสมบัติหมายเลขเฉพาะมาตรฐานของ mathematica แต่จะนับจำนวนเต็มในรายการ {n / 1, n / 2, ... , n / n}; ถ้าตัวเลขเป็น 1 หรือ 2 ดังนั้น n เป็นจำนวนเฉพาะ ฟังก์ชั่นที่ซับซ้อน

MyIsPrime[p_] := (q = Abs@p; 
  Total[Boole@IntegerQ[q/#] & /@ Range@q] < 3 && q != 0)

พล็อตโบนัสของ Gaussian Primes ทั้งหมดตั้งแต่ -20 ถึง 20:

พล็อตของ Gaussian primes



0

Python - 117 122 121

def f(a,b):
 v=(a**2+b**2,a+b)[a*b==0]
 for i in range(2,abs(v)):
  if v%i<1:a=b=0
 return abs((a,b)[a==0])%4==3or a*b!=0

เนื่องจาก 3 เป็นจำนวนที่มากที่สุดที่สามารถเป็น mod 4 คุณสามารถแทนที่==3ด้วย>2
FlipTack
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.