\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

  • \begingroup
    您见过Union[](用于合并和排序列表)吗?
    \endgroup


    – 

  • \begingroup
    不满足条件的素数在 OEIS 中似乎是
    \endgroup


    – 


最佳答案
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