定义素数的不同方法


32

我最喜欢的质数定义之一如下:

  • 2是最小的素数。

  • 如果大于2的数字不能被较小的质数整除,则为质数。

但是这个定义似乎是任意的,为什么2?为什么没有其他号码?好吧,让我们尝试其他一些数字来定义n-素数,这样

  • n是最小的n-素数。

  • 如果大于n的数字不能被较小的n-素数整除,则为n-素数。

任务

这里的任务是编写一个接受两个输入的程序,一个正整数n和一个正整数a。然后它将确定a是否为n-素数。您的程序应输出两个不同的值,一个表示“是,它是n-素数”,另一个表示“否,它不是n-素数”。

这是一个代码问题,因此答案将以字节计分,而字节数越少越好。

测验

以下是n = 2至n = 12的前31个素数的列表(1是唯一的1个素数)

n=2: [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=3: [3,4,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=4: [4,5,6,7,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=5: [5,6,7,8,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=6: [6,7,8,9,10,11,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=7: [7,8,9,10,11,12,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=8: [8,9,10,11,12,13,14,15,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=9: [9,10,11,12,13,14,15,16,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=10: [10,11,12,13,14,15,16,17,18,19,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=11: [11,12,13,14,15,16,17,18,19,20,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=12: [12,13,14,15,16,17,18,19,20,21,22,23,25,27,29,31,33,35,37,41,43,47,49,53,55,59,61,67,71,73,77]

4
n=6, a=15是第一个有趣的测试用例。
尼尔

6
这是非模式“ a为n-素数,如果n≤a<2n或(a≥2n并且a为素数)”的第一个地方。
Misha Lavrov

2
“如果大于2的数字不能被较小的质数整除,则为质数。” -此定义允许任何数字为质数。也许您想说iff而不是if

5
@ThePirateBay我不是说单词if的精确数学意义。我要离开它。
小麦巫师

1
@JeppeStigNielsen证明这一点并不难。所有为n-素数的复合数字必须仅具有小于n的素数因子。我们还知道,它们的因子的任何子集都不能具有大于n的乘积,因为我们的数可以被n整除。因此,每个n素数都是2素数或小于n的2个数的乘积。小于n的数量对只有有限数量的对,因此只有有限数量的复合n-素数对。希望这是有道理的,我不得不缩写以使其适合评论。
小麦巫师

Answers:




4

Python 3,45字节

lambda i,k:(i>k)<all(k%r for r in range(i,k))

在线尝试!

怎么运行的

这需要两个整数ik作为输入。首先检查k≥i。然后生成范围[i,k),并对该范围内的每个整数N检查N是否为k的素数。如果两个条件都满足,则ki-素数。


您不能使用&代替and>=i代替>i-1吗?
小麦巫师

@WheatWizard >=i 仍然是4个字节(由于空格)。
尼尔

@Neil如果更改为&您,则不需要空格。
小麦巫师


4

R44 37字节

function(a,n)a==n|a>n&all(a%%n:(a-1))

在线尝试!

-7字节归功于Giuseppe

TRUE如果返回

  • a等于n或(a==n|
  • a对于从到的每个数字k大于n a>n&),不能被k()整除na-1aall(a%%n:(a-1))

FALSE否则返回


欢迎来到PPCG!很棒的第一答案!
FantaC

3

J,30个字节

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:

在线尝试!

以起始值作为右参数,并以值检查左参数。

我本来就搞砸了,并且没有考虑左引数少于开始的素数。我现在对解决方案的长度有些不满意。

说明

x为左参数(值检查),并y是正确的参数(起始素数)。

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:
                          ^:>:  Execute left argument if x >= y
                     i.@[         Create range [0..x]
                   ]+             Add y to it (range now: [y..x+y])
                |/~               Form table of residues
            0=                    Equate each element to 0
          +/                      Sum columns
      1=                          Equate to 1
    -{                            Take the element at position x-y
>:*                             Multiply by result of x >= y

笔记

位置的元素x-y是的素数测试的结果x(因为我们添加了y到原始范围中)。

乘以x >: y可确保我们得到的虚假值(0x小于y


3

JavaScript(ES6),33 32 30字节

以currying语法接受输入(n)(a)。返回一个布尔值。

n=>p=(a,k=a)=>k%--a?p(a,k):a<n

演示版


3

Haskell,30个字节

H.PWiz的想法是从骗子的答案中借来的,节省了2个字节

n!a=[1]==[1|0<-mod a<$>[n..a]]

在线尝试!

好的,因为已经有一段时间了,到目前为止,Haskell的唯一答案是45 bty,所以我决定发布自己的答案。

说明

该函数检查其之间的唯一号码Ñ一个一个是由整除是一个本身。

现在,定义只提到小于a的n个素数,那么为什么还要检查所有这些额外的数字呢?不会,我们有问题的时候一个是由一些整除ñ -复合大于ñ

我们不会,因为如果n大于n,则必须按定义用较小的n-将其整除。因此,如果除以a,则较小的n-素数也必须如此。

如果a小于n, [n..a]则将[]不等于[1]导致校验失败。




1

C,55个字节

f(n,a,i){for(i=a;i-->n;)a%i||f(n,i)&&(i=0);return-1<i;}

在线尝试!

53个字节(如果允许多个真实返回值):

f(n,a,i){for(i=a;i-->n;)a%i||f(n,i)&&(i=0);return~i;}

在线尝试!


1

dc40 34 37字节

[0p3Q]sf?se[dler%0=f1+dle>u]sudle>u1p

我本应包含一个TIO链接,但是TIO似乎承载了错误的分布,dc因为它看起来像在我的系统上按预期方式工作一样,但是Q命令在TIO上错误地起作用。相反,这是指向bash测试平台的链接,其中包含正确运行的dc

演示一下!


1

APL(Dyalog),24字节

{⍵∊o/⍨1=+/¨0=o|⍨⊂o←⍺↓⍳⍵}

在线尝试!

怎么样?

⍳⍵- 1a

o←⍺↓- na,保存到o

o|⍨⊂o-将每个项目o与每个项目取模o

0=-检查等于0(除)的位置

+/¨ -总和数

1= -如果我们只有一个,那么数字只会被自己除

o/⍨ -所以我们保留这些事件

⍵∊- a在那个残留数组中吗?



0

JavaScript ES5,34字节

for(a=i=(p=prompt)();a%--i;);i<p()

0

加+,20字节

L,2Dx@rBcB%B]b*!!A>*

在线尝试!

L,   - Create a lambda function
     - Example arguments:  [5 9]
  2D - Copy below; STACK = [5 9 5]
  x  - Repeat;     STACK = [5 9 [9 9 9 9 9]]
  @  - Reverse;    STACK = [[9 9 9 9 9] 5 19] 
  r  - Range;      STACK = [[9 9 9 9 9] [5 6 7 8 9]]
  Bc - Zip;        STACK = [[9 5] [9 6] [9 7] [9 8] [9 9]]
  B% - Modulo;     STACK = [4 3 2 1]
  B] - Wrap;       STACK = [[4 3 2 1]]
  b* - Product;    STACK = [24]
  !! - Boolean;    STACK = [1]
  A  - Arguments;  STACK = [1 5 9]
  >  - Greater;    STACK = [1 1]
  *  - Product;    STACK = [1]
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.