다양한 깊이와 상호 의존적 한계가있는 테이블 만들기

Aug 21 2020

예를 들어 특정 소인수 만있는 주어진 한계까지 모든 정수를 찾고 싶습니다. 2, 3, 5의 경우 효율적으로 할 수 있습니다.

g = 100;
t1 = Table[{2^x*3^y*5^z}, {z, 0, Log[g]/Log[5]}, {y, 0, Log[g/(5^z)]/Log[3]}, {x, 0, Log[g/(5^z*3^y)]/Log[2]}]
t2 = Sort[Flatten[t1]]

그러나 나는 k 개의 다른 요소 세트를 가질 수있는 더 일반적인 솔루션을 찾고 있습니다. 시도 Nest했지만 멀리 가지 않았습니다. 그리고 난 하지 않습니다 같은 기능을 사용하려면 FactorInteger다음 Select좋은 것들. Table한계의 깊이 와 (아마도) 재귀 함수를 결합한 솔루션을 찾고 있습니다.

답변

2 KennyColnago Aug 22 2020 at 03:30

아마도 당신은 부드러운 숫자를 찾고있을 것입니다 . 이 함수 pSmoothOuter는 매우 빠르지 만 상한 m이 커지면 메모리가 필요합니다 . 입력 pmax은 허용되는 최대 소수입니다.

pSmoothOuter[pmax_Integer, m_] :=
   Block[{s},
      s = 2^Range[0, Log[2, m]];
      Do[
         s = Pick[s = Flatten[Outer[Times, s, p^Range[0, Log[p, m]]]], UnitStep[m - s], 1],
         {p, Prime[Reverse[Range[2, PrimePi[pmax]]]]}];
      Sort[s]]

예를 들면

pSmoothOuter[5,10^2]

{1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32,
36, 40, 45, 48, 50, 54 , 60, 64, 72, 75, 80, 81, 90, 96, 100}

AbsoluteTiming[{Total[#], Length[#]} &[pSmoothOuter[30, 10^8]]]

{0.015348, {2364148327261, 88415}}

다음 버전은 p반드시 연속적 일 필요는 없지만 소수의 입력 목록을 허용합니다 .

pSmoothOuter[p_List, m_] :=
   Block[{s},
      s = Min[p]^Range[0, Log[Min[p], m]];
      Do[
         s = Pick[s=Flatten[Outer[Times, s, q^Range[0, Log[q, m]]]], UnitStep[m - s], 1],
         {q, Most@Reverse[Sort[p]]}];
      Sort[s]]

예를 들면

pSmoothOuter[{5, 13, 11}, 800]

{1, 5, 11, 13, 25, 55, 65, 121, 125, 143, 169, 275, 325, 605, 625, 715}

2 march Aug 21 2020 at 01:23

작동합니다. 구조는 다루기 어렵고 간소화 할 수 있지만 적어도 다음과 같이 작동합니다.

makePrimes[numPrimes_, bound_] := Module[
  {powers = (Prime@Range[numPrimes])^Array[x, numPrimes] // Reverse},
  Sort@Flatten@Table[
    Times @@ powers // Evaluate,
    Sequence @@ MapThread[{#1, 0, #2} &,
      {Reverse@Array[x, numPrimes], 
       Log[bound/Prepend[Most@Exp@Accumulate@Log@powers, 1]]/Reverse@Log@Prime@Range[numPrimes]}
    ] // Evaluate
  ]
]

그때

makePrimes[3, 100]
(* {1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80, 81, 90, 96, 100} *)

OP의 예와 동일한 목록입니다.