编写一个接受两个整数a,b表示高斯整数z = a+bi (复数)的函数。程序必须返回true或false,这取决于a+bi是高斯素数。
a+bi是高斯素数当且仅当它满足下列条件之一:
你应该只写一个函数。如果您的语言没有函数,则可以假设整数存储在两个变量中,并打印结果或将其写入文件。
您不能使用语言的内置函数,如isprime
或prime_list
、nthprime
或factor
。最少的字节数获胜。程序必须适用于a,b,其中a^2+b^2是一个32位(有符号)整数,并且应该在不超过30秒的时间内完成。
点表示高斯平面上的素数(x
=实,y
=虚轴):
一些较大的素数:
(9940, 43833)
(4190, 42741)
(9557, 41412)
(1437, 44090)
发布于 2014-08-07 17:03:17
这里有一个相对简单的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
,然后可以在交互式shell中使用它。注意:负数是非常严格的,必须放在括号中。也就是说。
*Main>1#1
True
*Main>(-3)#0
True
*Main>2#2
False
发布于 2019-10-19 20:29:31
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
发布于 2019-11-19 00:56:40
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)
从-20到20的所有高斯素数的加成图:
https://codegolf.stackexchange.com/questions/35881
复制相似问题