Berechnen Sie eine aus Primfaktoren abgeleitete Ganzzahlsequenz

10

Erstellen Sie eine Funktion, einen Ausdruck oder ein Programm, das Folgendes ausführt:

  1. Nehmen Sie die Primfaktoren einer beliebigen Zahl und addieren Sie sie. Zum Beispiel sind die Primfaktoren von 28 2 2 7, summiert zu 11.
  2. Multiplizieren Sie das Ergebnis mit der Anzahl der Primfaktoren für die angegebene Anzahl. ZB hat 28 3 Primfaktoren, die sich zu 11 summieren. 11 * 3 ist 33.
  3. Wiederholen Sie den Vorgang rekursiv und speichern Sie die resultierende Liste (die mit der ursprünglichen Nummer beginnt), bis Sie eine Nummer erreichen, die bereits in der Liste enthalten ist. Halten Sie an, ohne diese endgültige Nummer hinzuzufügen, damit die Liste keine Duplikate enthält. Die Progression für 28 ist 28 33, weil 33 wieder 28 ergibt.
  4. Zählen Sie die Elemente in der resultierenden Liste. Im Fall von 28 lautet die Antwort 2.

Hier sind die Ergebnisse für 0<n<=10, damit Sie Ihren Algorithmus überprüfen können.

2 1 1 10 1 11 1 9 5 10

(Wie Balpha hervorhob, higley(1)lautet die Antwort für 2 aus der Liste 1 0. Ich hatte ursprünglich 1 aufgrund eines Fehlers in meinem ursprünglichen Algorithmus, der in J geschrieben wurde.)

Da ich ein eingebildeter SOB bin und dies bei OEIS nicht gefunden habe , nennen wir dies die "Higley-Sequenz", zumindest für die Dauer dieser Runde Code-Golf. Als zusätzlichen Bonus finden Sie die ersten beiden nmit dem niedrigsten, higley(n)wo nnicht prim und ist n>1. (Ich denke, es gibt nur zwei, aber ich kann es nicht beweisen.)

Dies ist Standard-Code-Golf, daher gewinnen wie üblich die wenigsten Tastenanschläge, aber ich bitte Sie, kluge Antworten in anderen Sprachen zu bewerten, auch wenn sie ausführlich sind.

Gregory Higley
quelle
4
Warum ist highley(1) == 1? Man hat keine Primfaktoren, also ist die resultierende Liste in 4) [1, 0]so, highley(1) == 2wie ich es sehe.
Balpha
Können wir annehmen, dass die Eingangsnummer und die Zwischenwerte nicht größer als 2 ^ 31-1 sind (dh in eine vorzeichenbehaftete 32-Bit-Ganzzahl passen)?
Peter Taylor
@ Peter Taylor Sicher.
Gregory Higley
Falls es jemand hilfreich findet, sind die OEIS-Sequenzen, die vage verwandt sind und möglicherweise Inspiration liefern, A001414, A001222 und A002217.
Peter Taylor
1
Da Sie nicht kommentiert haben, nehme ich an, dass Sie es nicht bemerkt haben: Ich habe bewiesen, dass es nur die zwei nicht primären Fixpunkte gibt, und habe es als Anhang zu meinem Beitrag hinzugefügt.
Peter Taylor

Antworten:

6

J, 47 45

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

Es ist möglich, dass dies ohne Verwendung viel kürzer wäre ^:_, aber mein Gehirn ist bereits ausreichend gebraten.

Bearbeiten: (47-> 45) Doppelcoupon-Tag.

Verwendungszweck:

   higley =: #@((~.@,(+/@{:*+/@:*/)@(2&p:)@{:)^:_)`2:@.(=&1)
   higley 1
2
   higley"0 (1 + i. 10)
2 1 1 10 1 11 1 9 5 10
Jesse Millikan
quelle
Beeindruckend! Eine AJ-Lösung, die kürzer als eine GolfScript-Lösung ist. Der erste, den ich gesehen habe. (Ich bin ein großer Fan von J.)
Gregory Higley
3
Sie können dies erheblich verkürzen, indem Sie einen etwas anderen Algorithmus verwenden: #@((~.@,((+/*#)@:q:)@{:)^:_)`2:@.(=&1)38 Zeichen.
Gregory Higley
Wow, ich habe versucht herauszufinden, wie es mit q: geht, aber ich habe versucht, es in meine 2 p: -Lösung zu integrieren, damit ich es nicht verstehe. Rückblickend offensichtlich.
Jesse Millikan
Die Tatsache, dass man sich diese Explosion von Charakteren ansehen und sie " im Nachhinein offensichtlich " sagen kann, ist einfach umwerfend. Eines Tages sollte ich Golfscript oder J.
Casey
@Casey Ich habe mich auf die gleiche Weise gefühlt, aber je mehr J du lernst und verwendest, desto mehr "springt es auf dich los", obwohl ich immer noch Dinge sehe, die ich herausfinden muss. Eine hilfreiche Sache, die Sie über J wissen sollten, ist, dass Sie a hinzufügen. oder: nach einem Symbol, erstellt es ein neues Symbol, zum Beispiel {, {.und {:alle Mittel verschiedenen Dinge, aber {-(zum Beispiel) auf jeden Fall eine Folge von zwei Dingen ist, {und -.
Gregory Higley
5

Golfscript, 68 67 62 61 Zeichen

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

Dies ist ein Ausdruck: Er nimmt nden Stapel an und belässt das Ergebnis auf dem Stapel. Um daraus ein Programm zu machen, das nvon stdin übernommen und das Ergebnis nach stdout gedruckt wird, ersetzen Sie das führende [durch~

Das Herzstück ist [.2@{1$1$%{)}{\1$/1$}if}*;;](28 Zeichen), das die oberste Zahl auf dem Stapel nimmt und (durch einen unglaublich ineffizienten Algorithmus) eine Liste seiner Primfaktoren generiert. Pseudocode-Äquivalent im C-Stil:

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

Die 0+kurz vor {+}*ist der Sonderfall zu behandeln n==1, weil Golfscript nicht wie eine binäre Operation über die leere Liste zu falten.

Einer der nicht primären Fixpunkte ist 27; Ich fand dies, ohne das Programm zu verwenden, indem ich das Mapping (p a -> a 2 p), das ein Fixpunkt ist, wenn a == p (a-1) / 2 ist , und versuchte es klein a. ( a==1gibt die Fixpunktgenauigkeit von Primzahlen an).

Bei der Suche mit dem Programm wird ein zweiter Fixpunkt angezeigt: 30 = (2 + 3 + 5) * 3


Anhang: Beweis, dass es nur zwei Nicht-Prim-Fixpunkte gibt

Notation: sopfr(x)ist die Summe der Primfaktoren von xmit Wiederholung (A001414). Omega(x)ist die Anzahl der Primfaktoren von x(A001222). Die Higley-Nachfolgerfunktion ist alsoh(x) = sopfr(x) Omega(x)

Angenommen, wir haben einen Fixpunkt, N = h(N)der ein Produkt von n=Omega(N)Primzahlen ist.

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

Grundlegende Zahlentheorie: nteilt sich in p_0 ... p_{n-1}, so dass w=Omega(n)von diesen Primzahlen die Primfaktoren von sind n. Wlog wir nehmen sie als die letzten w. So können wir beide Seiten durch teilen nund bekommen

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

oder

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

Da alle der Primzahlen p_0bis p_{n-w-1}größer als 1 sind , die Erhöhung einer von ihnen erhöht sich die LHS mehr als die RHS. Für eine gegebene nkönnen wir also alle Kandidatenlösungen aufzählen.

Insbesondere kann es keine Lösungen geben, wenn die LHS größer als die RHS ist und alle "freien" Primzahlen auf 2 gesetzt werden. Dh es gibt keine Lösungen, wenn

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

Da sopfr(n) <= n(mit Gleichheit nur für n = 4 oder n Primzahl) können wir die schwächere Aussage treffen, dass es keine Fixpunkte gibt, wenn

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

Wenn wwir dies festhalten, können wir verschiedene Werte für die nBefriedigung auswählen w=Omega(n). Das kleinste davon nist 2^w. Beachten Sie, dass wenn 2^{n-w}mindestens 3 ist (dh wenn n-w>1, was wahr ist, wenn n>2), das Erhöhen nbei wkonstantem Halten die LHS mehr als die RHS erhöht. Beachten Sie auch, dass für w>2und unter Berücksichtigung der kleinstmöglichen ndie Ungleichung erfüllt ist und es keine Fixpunkte gibt.

Damit bleiben uns drei Fälle: w = 0und n = 1; w = 1und nist primitiv; oder w = 2und nist semi-prime.

Fall w = 0. n = 1, so Nist jede Primzahl.

Fall w = 1. Wenn n = 2dann N = 2pund wir benötigen p = p + 2, hat das keine Lösungen. Wenn n = 3dann haben wir pq = p + q + 3und zwei Lösungen, (p=2, q=5)und (p=3, q=3). Wenn n = 5dann 2^4 > 3 * 5 - 2 * 1, so gibt es keine weiteren Lösungen mit w = 1.

Fall w = 2. Wenn n = 4dann N = 4pqund wir benötigen pq = p + q + 4. Dies hat eine ganzzahlige Lösung p=2, q=6, aber keine primären Lösungen. Wenn n = 6dann 2^4 > 3 * 6 - 2 * 2, so gibt es keine weiteren Lösungen mit w = 2.

Alle Fälle sind erschöpft, daher sind die einzigen nicht primären Fixpunkte 27 und 30.

Peter Taylor
quelle
1
Ich habe diese beiden Fixpunkte mit Bleistift und Papier gefunden: 27 und 30. Ich würde OP zustimmen, es scheint, dass dies die einzigen beiden sind.
Mellamokb
1
Die nächste interessante Frage könnte sein. Gibt es unendlich viele Higley (x) = 2? Wie wäre es mit einer Möglichkeit, ein beliebiges Higley (x) zu erzeugen, z. B. Higley (x) = 100?
Mellamokb
Sehr schön! Ich bin ein J-Typ, muss aber möglicherweise GolfScript lernen.
Gregory Higley
@mellamokb Ich denke, es gibt eine Reihe von interessanten Fragen zu dieser Sequenz. Wenn wir zum Beispiel die Folge von Zahlen betrachten, die für jede nvor dem Zählen erzeugt wurden , gibt es nnach 49 eine Nicht-Primzahl, für die diese Folge nicht mit 28 endet?
Gregory Higley
2
Eine weitere interessante Frage ist, ob es eine einfache Funktion gibt, nderen Grenzen higley(n)oben liegen. (Dies würde eine erhebliche Vereinfachung der Schleife ermöglichen - einfach die f(n)Zeiten wiederholen und dann Duplikate verwerfen).
Peter Taylor
4

Ruby, 92 Zeichen

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}

Diese Lösung geht davon aus, dass Higley (1) tatsächlich 2 und nicht 1 ist (siehe Balphas Kommentar oben):

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

Oktave - 109 Zeichen

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