\begingroup
每个素数(大部分)都可以通过拥有一个现有的素数,然后在其前面或后面填充一个数字来生成(得到的数字也将是素数)。
例子:
23 is a Prime, Add a 2 in front: 223 is also a Prime
11 is a Prime, Add a 3 in the back: 113 is also a Prime
现在有一些素数不存在此模式。我正在尝试查看哪些素数不属于此类别。
因此,如果我首先获取几个素数,然后填充它们并查看结果是否为素数:
前衬垫:
FromDigits@*Flatten@*IntegerDigits /@
Select[Tuples[{Range[9], Prime[Range[10]]}],
PrimeQ[FromDigits[
Join[IntegerDigits[#[[1]]], IntegerDigits[#[[2]]]]]]
&]
===>
{13, 17, 113, 23, 211, 223, 229, 37, 311, 313, 317, 43, 47, 419, 53, 523, 67, 613, 617, 619, 73, 719, 83, 811, 823, 829, 97, 911, 919, 929}
背衬:
FromDigits@*Flatten@*IntegerDigits /@
Select[Tuples[{Prime[Range[10]], Range[10] - 1}],
PrimeQ[FromDigits[
Join[IntegerDigits[#[[1]]], IntegerDigits[#[[2]]]]]]
&]
===>
{23, 29, 31, 37, 53, 59, 71, 73, 79, 113, 131, 137, 139, 173, 179, 191, 193, 197, 199, 233, 239, 293}
这些都是 Prime – 但这只是给我一个列表。我需要:
1-将它们合并为一个列表,并按顺序排列。
2-更重要的是,看看哪些原始素数没有结果素数。需要识别这些素数。(例如:773)-如果我们将原始范围扩大到 10
\endgroup
2
最佳答案
4
\begingroup
Select[Prime[Range[1000]],
Not[Or @@
PrimeQ[Join[(f |-> FromDigits@Prepend[IntegerDigits[#], f]) /@
Range[9], (f |-> FromDigits@Append[IntegerDigits[#], f]) /@
Range[9]]]] &]
{773, 1103, 1301, 3947, 3989, 4241, 4637, 4931, 5039, 5387, 5417,
6803, 6917, 6971, 7229, 7451, 7703, 7753}
\endgroup
1
-
2\begingroup
哈!太巧了:我们都选择了前 1000 个素数进行测试。(我想你这样做的原因和我一样:前 100 个素数不包含任何失败的素数。)
\endgroup
–
|
\begingroup
编写一个函数来检查素数(p
为了提高效率,假设是素数):
goodP[p_] := With[{nextPower = 10^Ceiling@Log10[N@p]},
AnyTrue[Join[Range[9] nextPower + p, 10*p + {1, 3, 7, 9}], PrimeQ]];
挑选“坏”素数:
With[{primes = Prime[Range[1000]]},
Pick[primes, goodP /@ primes, False]]
(*
{773, 1103, 1301, 3947, 3989, 4241, 4637, 4931, 5039, 5387, 5417,
6803, 6917, 6971, 7229, 7451, 7703, 7753}
*)
以下根据任务是否成功对启动项进行分组:
pdata = With[{primes = Prime[Range[1000]]}, GroupBy[primes, goodP]];
pdata[False]
(*
{773, 1103, 1301, 3947, 3989, 4241, 4637, 4931, 5039, 5387, 5417,
6803, 6917, 6971, 7229, 7451, 7703, 7753}
*)
pdata[True] // Short
(* {2, 3, 5, 7, 11, 13, 17, <<968>>, 7873, 7877, 7879, 7883, 7901, 7907, 7919} *)
\endgroup
|
\begingroup
如果素数符合模式则返回 True,否则返回 False:
check[p_] := Module[{d = IntegerDigits[p], r = Range[0, 9]},
pre = FromDigits /@ (Prepend[d, #] & /@ Rest@r );
end = FromDigits /@ (Append[d, #] & /@ r );
AnyTrue[Join[pre, end], PrimeQ]
]
要获取满足模式的素数的有序列表:
Select[Table[Prime[i], {i, 2, 100}], check]
{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, 131, 137, 139, \
149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, \
227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, \
307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, \
389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, \
467, 479, 487, 491, 499, 503, 509, 521, 523, 541}
下列素数不满足条件:
Select[Table[Prime[i], {i, 2, 1000}], ! check[#] &]
{773, 1103, 1301, 3947, 3989, 4241, 4637, 4931, 5039, 5387, 5417, \
6803, 6917, 6971, 7229, 7451, 7703, 7753}
\endgroup
|
\begingroup
paddedPrimes[k_Integer /; k > 0] := FromDigits /@ Join[
Thread@Prepend[IntegerDigits[k], Range[1, 9]]
, Thread@Append[IntegerDigits[k], Range[1, 9, 2]]
] // Select[PrimeQ]
用法
Prime[Range[1, PrimePi[10000]]] //
Select[EqualTo[0]@*Length@*paddedPrimes]
{773, 1103, 1301, 3947, 3989, 4241, 4637, 4931, 5039, 5387, 5417,
6803, 6917, 6971, 7229, 7451, 7703, 7753}
\endgroup
|
您见过
Union[]
(用于合并和排序列表)吗?\endgroup
–
不满足条件的素数在 OEIS 中似乎是
\endgroup
–
|