是半素吗?


26

令人惊讶的是,我认为我们没有确定数字是否为准素数的问题。

半素数是一个自然数,它是两个(不一定是不同的)素数的乘积。

很简单,但是一个非常重要的概念。

给定一个正整数,请确定它是否为半素数。您的输出可以是任何形式,只要它为任何真实或错误值提供相同的输出即可。您可能还假设您的输入足够小,因此性能或溢出都不是问题。

测试用例:

input -> output
1     -> false
2     -> false
3     -> false
4     -> true
6     -> true
8     -> false
30    -> false   (5 * 3 * 2), note it must be EXACTLY 2 (non-distinct) primes
49    -> true    (7 * 7)      still technically 2 primes
95    -> true
25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784406918290641249515082189298559149176184502808489120072844992687392807287776735971418347270261896375014971824691165077613379859095700097330459748808428401797429100642458691817195118746121515172654632282216869987549182422433637259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133844143603833904414952634432190114657544454178424020924616515723350778707749817125772467962926386356373289912154831438167899885040445364023527381951378636564391212010397122822120720357
      -> true, and go call someone, you just cracked RSA-2048

这是,因此适用标准规则!


4
@WheatWizard有一个稍微的区别,一个是要求3个质数(对于几乎所有语言而言并没有很大的不同),它仅适用于不同的质数(某些语言是完全不同的)。如果您想继续进行更详细的讨论,我可以在聊天中与您讨论。
HyperNeutrino

2
@WheatWizard您提出了一个要点,但是类似地,我们已经有很多类型的问题,尽管与您所表达的相反,大多数问题的确对他们的领域做出了重大贡献,但这个问题有足够的区别我认为这值得一个单独的问题/帖子。
HyperNeutrino

2
@hyperneutrino着眼于这两个挑战的答案,似乎区别在于源代码中只有一个数字,即2与3。我很难说这有很大的区别。
小麦巫师

2
@WheatWizard也有“与众不同”与“不明显” ...
HyperNeutrino

3
@LordFarquaad仅仅因为它重复并不意味着它是坏的。在我看来,重复是一件好事,这意味着您要问的是社区觉得足够有趣的事情,已经问过。
小麦巫师

Answers:


19

Brachylog,2 个字节

基本上是Fatalize对Sphenic数字挑战的回答的移植。

ḋĊ

在线尝试!

怎么样?

ḋĊ - implicitly takes input
ḋ  - prime factorisation (with duplicates included)
 Ċ - is a couple

1
确实适合该工作的语言:P
HyperNeutrino

2
@Uriel Ċ实际上是两个变量的内置列表;作为一种声明性语言,默认情况下,输出是对满意度的测试(例如true.对于非负整数,其输出本身)。
乔纳森·艾伦,

这2个字节如何?
哈罗德

1
@harold我刚刚更新为在Brachylog的代码页的标题链接中添加“字节”。十六进制转储将是c6 eb
乔纳森·艾伦




7

Python 3,54个字节

lambda n:0<sum((n%x<1)+(x**3==n)for x in range(2,n))<3

在线尝试!

以前的VERSON对大立方体数(四舍五入的一些问题125343等等),
这将计算除数的量(不仅是素数),如果有12返回True
唯一的例外是,当一个数有两个以上的质数但只有两个除数时。在这种情况下,它是素数的理想立方体(除数是其立方根和平方根的平方)。x**3==n将解决这种情况,将一个加到多维数据集根条目会将总数加到3,并停止假阳性。 感谢乔纳森·艾伦(Jonathan Allan)撰写的优美解释


这声称8是半素
xnor

n**(1/3)%1>0<sum...应该管用。
丹尼斯,

1
@xnor修复了它。
Rod

进行了微小的编辑(例如6立方具有更多的除数)
乔纳森·艾伦

6

红宝石56 48字节

->x{r=c=2;0while x%r<1?(x/=r;c-=1):x>=r+=1;c==0}

在线尝试!

怎么运行的:

->x{                    # Lambda function
    r=c=2;              # Starting from r=2, c=2
    0 while             # Repeat (0 counts as a nop)
        x%r<1? (        # If x mod r == 0
            x/=r:       # Divide x by r
            c-=1        # decrease c
        ):              # else
            x>=r+=1     # increase r, terminate if r>x 
    );
    c==0                # True if we found 2 factors
}

感谢Value Ink节省8个字节的想法。


为什么不c让它从0开始并开始计数,而不是将它添加所有因子成为一个数组呢?这样一来,您就可以size
Value Ink,2008年

没错,这是因为我为另一个挑战编写了分解函数,并在这里重用了它。
GB



4

Python 2,67字节

lambda k:f(k)==2
f=lambda n,k=2:n/k and(f(n,k+1),1+f(n/k,k))[n%k<1]

在线尝试!

-10个字节感谢@JonathanAllan!

Prime分解算法的功劳归于Dennis(在初始版本中)


您是否使用了丹尼斯答案中的代码?如果是这样,您应该功劳。
totalhuman

1
@totallyhuman哦,是的,很抱歉。我今天在2个不同的答案中使用了它,我对其中之一表示赞赏,但我忘记了在这里再次这样做。感谢您发现!
Xcoder先生17年


@JonathanAllan Wow,非常感谢!
Xcoder先生17年


4

JavaScript(ES6),47个字节

返回一个布尔值。

n=>(k=1)==(d=n=>++k<n?n%k?d(n):d(n/k--)+1:0)(n)

演示版


4

Mathematica 32字节

多亏了ngenesis节省了1个字节

Tr@FactorInteger[#][[;;,2]]==2&

1
使用;;而不是保存一个字节All
ngenisis





3

Dyalog APL,18个字节

⎕CY'dfns'
2=≢3pco⎕

在线尝试!

怎么样?

⎕CY'dfns' -进口 pco

3pco⎕- pco在带有左参数3(素数因子)的输入上运行

2=≢ -长度= 2?


3

盖亚 4字节

ḍl2=

4字节似乎是一个常见的长度,我不知道为什么...:P

在线尝试!

说明

ḍ     Prime factors
 l    Length
  2=  Equals 2?

4个字节似乎是一个常见的长度,我不知道为什么...-可能是因为所有答案都是素数,长度等于2?
Xcoder先生

@MrXcoder没错,正是
商务猫

其中4个是我的BTW> _>
Xcoder先生17年

4也是第一个半素数。幽灵般的!
尼尔




2

Java 8,69 61字节

n->{int r=1,c=2;for(;r++<n;)for(;n%r<1;n/=r)c--;return c==0;}

-8个字节感谢@Nevay

在这里尝试。


1
您可以删除else语句(可能是else++r;)以节省8个字节n->{int r=1,c=2;for(;r++<n;)for(;n%r<1;n/=r)c--;return c==0;}
涅瓦


1

C#,112字节

n=>{var r=Enumerable.Range(2,n);var l=r.Where(i=>r.All(x=>r.All(y=>y*x!=i)));return l.Any(x=>l.Any(y=>y*x==n));}

应用格式:

n =>
{
    var r = Enumerable.Range (2, n);
    var l = r.Where (i => r.All (x => r.All (y => y * x != i)));
    return l.Any (x => l.Any (y => y * x == n));
}

并作为测试程序:

using System;
using System.Linq;


namespace S
{
    class P
    {
        static void Main ()
        {
            var f = new Func<int, bool> (
                n =>
                {
                    var r = Enumerable.Range (2, n);
                    var l = r.Where (i => r.All (x => r.All (y => y * x != i)));
                    return l.Any (x => l.Any (y => y * x == n));
                }
            );

            for (var i = 0; i < 100; i++)
                Console.WriteLine ($"{i} -> {f (i)}");
            Console.ReadLine ();
        }
    }
}

具有以下输出:

0 -> False
1 -> False
2 -> False
3 -> False
4 -> True
5 -> False
6 -> True
7 -> False
8 -> False
9 -> True
10 -> True
11 -> False
12 -> False
13 -> False
14 -> True
15 -> True
16 -> False
17 -> False
18 -> False
19 -> False
20 -> False
21 -> True
22 -> True
23 -> False
24 -> False
25 -> True
26 -> True
27 -> False
28 -> False
29 -> False
30 -> False
31 -> False
32 -> False
33 -> True
34 -> True
35 -> True
36 -> False
37 -> False
38 -> True
39 -> True
40 -> False
41 -> False
42 -> False
43 -> False
44 -> False
45 -> False
46 -> True
47 -> False
48 -> False
49 -> True
50 -> False
51 -> True
52 -> False
53 -> False
54 -> False
55 -> True
56 -> False
57 -> True
58 -> True
59 -> False
60 -> False
61 -> False
62 -> True
63 -> False
64 -> False
65 -> True
66 -> False
67 -> False
68 -> False
69 -> True
70 -> False
71 -> False
72 -> False
73 -> False
74 -> True
75 -> False
76 -> False
77 -> True
78 -> False
79 -> False
80 -> False
81 -> False
82 -> True
83 -> False
84 -> False
85 -> True
86 -> True
87 -> True
88 -> False
89 -> False
90 -> False
91 -> True
92 -> False
93 -> True
94 -> True
95 -> True
96 -> False
97 -> False
98 -> False
99 -> False


1

视网膜,45字节

.+
$*
^(11+)(\1)+$
$1;1$#2$*
A`\b(11+)\1+\b
;

在线尝试!链接包括测试用例。说明:

.+
$*

转换为一元。

^(11+)(\1)+$
$1;1$#2$*

尝试找到两个因素。

A`\b(11+)\1+\b

确保两个因素都是首要的。

;

确保找到两个因素。


1

Python 2,90个字节

def g(x,i=2):
 while x%i:i+=1
 return i
def f(n,l=0):
 while 1%n:l+=1;n/=g(n)
 return l==2

fn大于或等于的整数1,返回布尔值。

在线尝试!

测试用例:

>>> f(1)
False
>>> f(2)
False
>>> f(3)
False
>>> f(4)
True
>>> f(6)
True
>>> f(8)
False
>>> f(30)
False
>>> f(49)
True
>>> f(95)
True

1

J,6个字节

5个字节可以一次性使用:

   2=#q: 8
0
   2=#q: 9
1

我相信在定义函数时我需要六个:

   semiprime =. 2=#@q:
   (,. semiprime) 1 + i. 20
 1 0
 2 0
 3 0
 4 1
 5 0
 6 1
 7 0
 8 0
 9 1
10 1
11 0
12 0
13 0
14 1
15 1
16 0
17 0
18 0
19 0
20 0



0

Perl 6、43字节

{my \f=first $_%%*,2..$_;?f&&is-prime $_/f}

在线尝试!

f是大于输入自变量1的最小因子$_,或者Nil如果$_为1。如果f为true(即,不是Nil)且输入自变量除以因子,则该函数的返回值为true 。

如果$_本身是素数,f则将等于$_,并且$_ / f为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.