素因数から導出された整数列を計算する


10

以下を実行する関数、式、またはプログラムを作成します。

  1. 任意の数の素因数を取り、それらを合計します。たとえば、28の素因数は2 2 7であり、合計すると11になります。
  2. 結果に、指定された数の素因数を掛けます。たとえば、28には3つの素因数があり、合計は11になります。11* 3は33です。
  3. リストに既に含まれている番号に到達するまで、結果のリスト(元の番号で始まる)を保存して、プロセスを再帰的に繰り返します。その最終的な番号を追加せずに停止し、リストに重複が含まれないようにします。33が再び28になるため、28の進行は28 33です。
  4. 結果のリストの要素を数えます。28の場合、答えは2です。

の結果は次のとおりな0<n<=10ので、アルゴリズムを確認できます。

2 1 1 10 1 11 1 9 5 10

(balphaが指摘したように、higley(1)リスト1 0からの答えは2です。Jで書かれた元のアルゴリズムのバグのため、私は最初は1でした。)

私はうんざりしたSOBであり、OEISでこれを見つけられなかったので、少なくともこのラウンドのコードゴルフの期間中、これを「ヒグレーシーケンス」と呼びましょう。追加のボーナスとして、最初の2つnが最も低いhigley(n)where nが素数ではなく、を見つけますn>1。(私は2つしかないと思いますが、それを証明することはできません。)

これは標準のコードゴルフなので、いつものようにキーストロークが最も少なくなりますが、たとえ冗長であっても、他の言語で賢い回答に投票してください。


4
なんでhighley(1) == 1?4での結果のリスト)があるので、一つは、何の素因数を持っていない[1, 0]ので、highley(1) == 2私はそれを見るように。
balpha

入力数と中間値が2 ^ 31-1以下であると想定できますか(つまり、符号付き32ビット整数に適合します)。
Peter Taylor、

@ピーターテイラー確かに。
グレゴリーヒグレイ

誰かが役立つと思う場合、漠然と関連していて、いくつかのインスピレーションを提供する可能性があるOEISシーケンスは、A001414、A001222、およびA002217です。
Peter Taylor

1
あなたはコメントしていないので、あなたは気づいていないと思います:私は2つの非素数のフィックスポイントしかないことを証明し、それを付録として私の投稿に追加しました。
Peter Taylor、

回答:


6

J、47 45

#@((~.@,[:(+/@{:*+/@:*/)2 p:{:)^:_)`2:@.(=&1)

を使用しない場合^:_はこれよりもはるかに短くなる可能性がありますが、私の脳はすでに十分に揚げられています。

編集:(47-> 45)ダブルクーポン日。

使用法:

   higley =: #@((~.@,(+/@{:*+/@:*/)@(2&p:)@{:)^:_)`2:@.(=&1)
   higley 1
2
   higley"0 (1 + i. 10)
2 1 1 10 1 11 1 9 5 10

うわー!GolfScriptソリューションよりも短いAJソリューション。私が見た最初のもの。(私はJの大ファンです。)
グレゴリーヒグレイ

3
少し異なるアルゴリズムを使用することで、これを大幅に短縮できます:#@((~.@,((+/*#)@:q:)@{:)^:_)`2:@.(=&1)38文字です。
グレゴリーヒグレイ

うわー、私はq:でそれを行う方法を理解しようとしましたが、それを私の2 p:ソリューションに処理しようとしていたので、取得できませんでした。振り返ってみると明らかです。
ジェシーミリカン

そのキャラクターの爆発を見て、「振り返ってみると明らか」と言うことができるという事実は、単に私の心を吹き飛ばします。これらの日の1つは、GolfscriptまたはJをチェックアウトする必要があります。–
ケーシー

@Casey一度は同じように感じましたが、Jを習得して使用すればするほど、「飛び跳ねる」ようになります。Jについて知っておくと役立つことの1つは、。または:記号の後に、それは、例えば、新しいシンボルを作成し{{.し、{:すべての平均値の異なるものが、{-(例えば)間違いなく二つのシーケンスである、{-
Gregory Higley、2011

5

Golfscript、68 67 62 61文字

[.]({[.2@{1$1$%{)}{\1$/1$}if}*;;].,*0+{+}*.2$?@@.@+\@)!}do;,(

これは式です。nスタックを受け取り、結果をスタックに残します。nstdinから結果をstdoutに出力するプログラムに変換するには、先頭[を次のように置き換えます。~

その中心は[.2@{1$1$%{)}{\1$/1$}if}*;;](28文字)で、スタックのトップの数値を取り、(非常に非効率的なアルゴリズムによって)その素因数のリストを生成します。同等のCスタイルの擬似コード:

ps = [], p = 2;
for (int i = 0; i < n; i++) {
    if (n % p == 0) {
        ps += p;
        n /= p;
    }
    else p++;
}

0+直前には、{+}*特殊なケースを処理することですn==1Golfscriptは空のリストの上に二項演算折りたたみ好きではないので、。

非素数の不動点の1つは27です。プログラムを使用せずにこれを見つけたのは、a == p (a-1)/ 2の場合の固定点であるマッピング(p a -> a 2 p)を考慮し、小さなを試したところです。(素数の不動点を与える)。aa==1

プログラムで検索すると、2番目の固定点が表示されます。30=(2 + 3 + 5)* 3


付録:プライム以外のフィックスポイントが2つしかないことの証明

表記:sopfr(x)は、x繰り返し(A001414)を伴うの素因数の合計です。(A001222)のOmega(x)素数の数ですx。したがって、ヒグレー後継関数はh(x) = sopfr(x) Omega(x)

素数のN = h(N)積である不動点があるとしますn=Omega(N)

N = p_0 ... p_{n-1} = h(N) = n (p_0 + ... + p_{n-1})

基本的な数論:にn分割するp_0 ... p_{n-1}のでw=Omega(n)、これらの素数のうちはの素数ですn。それらを最後にするためのブログw。だから私たちは両側を分けて得ることができnます

p_0 ... p_{n-w-1} = p_0 + ... + p_{n-1}

または

p_0 ... p_{n-w-1} = p_0 + ... + p_{n-w-1} + sopfr(n)

素数のすべてのことを考えるp_0ためにp_{n-w-1}それらのいずれかがLHS以上RHSより高く上げる、1よりも大きいです。したがって、特定のについて、nすべての候補ソリューションを列挙できます。

特に、LHSがRHSよりも大きく、すべての「フリー」プライムが2に設定されている場合、解決策はありません。

2^{n-w} > 2 (n-w) + sopfr(n)

以来sopfr(n) <= n(のみのn = 4またはNの素数のための平等と)、私たちは何fixpoints場合が存在しないこと弱い声明を出すことができます

2^{n-w} > 3 n - 2 w

ホールディングは、w我々は異なる値を選択することができ、固定n満足をw=Omega(n)。最小のものn2^wです。が2^{n-w}3以上の場合(つまり、の場合n-w>1はtrue n>2)、定数nを保持しながらw増加すると、RHSよりもLHSが増加することに注意してください。また、w>2可能な限り最小nの不等式が満たされ、不動点がないことにも注意してください。

:3例と葉たちをそれw = 0n = 1w = 1そしてn素数です。またはw = 2nセミプライムです。

ケースw = 0n = 1、そうN素数です。

ケースw = 1。場合はn = 2、その後N = 2p、我々は必要としp = p + 2、その解がありません。場合はn = 3、その後、私たちは持っているpq = p + q + 32つの溶液、(p=2, q=5)および(p=3, q=3)。場合はn = 5、その後2^4 > 3 * 5 - 2 * 1、そうでそれ以上の解決策はありませんw = 1

ケースw = 2。もしn = 4それがN = 4pq必要な場合pq = p + q + 4。これには整数解がp=2, q=6ありますが、主要な解はありません。場合はn = 6、その後2^4 > 3 * 6 - 2 * 2、そうでそれ以上の解決策はありませんw = 2

すべてのケースが使い果たされているため、非素数の固定点は27と30のみです。


1
鉛筆と紙を使用して、これら2つの同じ固定点を見つけました:27と30。私はOPに同意するでしょう。
mellamokb 2011

1
次の興味深い質問かもしれません。higley(x)= 2は無限にありますか?higley(x)= 100など、任意のhigley(x)を生成する方法はありますか?
mellamokb 2011

非常に素晴らしい!私はJ男ですが、GolfScriptを学ぶ必要があるかもしれません。
グレゴリーヒグレイ

@mellamokbこのシーケンスには興味深い質問がたくさんあると思います。たとえば、nカウントされる前にそれぞれについて生成された数値のシーケンスを考慮すると、n49の後に、そのシーケンスが28で終わらない非素数がありますか?
Gregory Higley、2011

2
もう1つ興味深い質問は、上記のn範囲の単純な関数があるかどうかhigley(n)です。(これにより、ループを大幅に簡略化することができます- f(n)時間を反復して、重複を破棄するだけです)。
Peter Taylor

4

ルビー、92文字

f=->i{r=[i];(x=s=0;(2..i).map{|j|(s+=j;x+=1;i/=j)while i%j<1};r<<i=s*x)until r.uniq!;r.size}

このソリューションは、higley(1)が実際には1ではなく2であることを前提としています(上記のbalphaのコメントを参照)。

(1..10).map &f
=> [2, 1, 1, 10, 1, 11, 1, 9, 5, 10]

2

オクターブ-109文字

l=[input('')];while size_equal(unique(l),l);n=factor(l(1));l=[sum(n)*length(n) l];endwhile;disp(length(l)-1);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.