Einführung
Betrachten Sie eine Folge von Ganzzahlen f, die wie folgt definiert sind:
- f (2) = 2
- Wenn n eine ungerade Primzahl ist, dann ist f (n) = (f (n-1) + f (n + 1)) / 2
- Wenn n = p · q zusammengesetzt ist, dann ist f (n) = f (p) · f (q)
Es ist nicht sehr schwer zu erkennen, dass f (n) = n für jedes n ≥ 2 ist , und daher wäre die Berechnung von f keine sehr interessante Herausforderung. Nehmen wir eine Änderung der Definition vor: Halbieren Sie den ersten Fall und verdoppeln Sie den zweiten Fall. Wir bekommen eine neue Sequenz g definiert wie folgt:
- g (2) = 1
- Wenn n eine ungerade Primzahl ist, dann ist g (n) = g (n-1) + g (n + 1)
- Wenn n = p · q zusammengesetzt ist, dann ist g (n) = g (p) · g (q)
Die Aufgabe
Ihre Aufgabe ist es, eine ganze Zahl n ≥ 2 als Eingabe zu nehmen und g (n) als Ausgabe zu erzeugen . Sie müssen sich keine Gedanken über einen Ganzzahlüberlauf machen, sollten jedoch in der Lage sein, g (1025) = 81 korrekt zu berechnen , und Ihr Algorithmus sollte theoretisch für beliebig große Eingaben funktionieren.
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt.
Beispiel
Ich habe oben behauptet, dass g (1025) = 81 , also lassen Sie es uns von Hand berechnen. Die Primfaktorisierung von 1025 ergibt
1025 = 5*5*41 => g(1025) = g(5)*g(5)*g(41)
Da 41 Prime ist, bekommen wir
g(41) = g(40) + g(42)
Als nächstes berechnen wir die Primfaktoren von 40 und 42 :
40 = 2*2*2*5 => g(40) = g(2)*g(2)*g(2)*g(5) = g(5)
42 = 2*3*7 => g(42) = g(2)*g(3)*g(7) = g(3)*g(7)
Für diese kleinen Primzahlen bekommen wir
g(3) = g(2) + g(4) = 1 + 1 = 2
g(5) = g(4) + g(6) = 1 + 2 = 3
g(7) = g(6) + g(8) = 2 + 1 = 3
Das bedeutet, dass
g(41) = g(40) + g(42) = g(5) + g(3)*g(7) = 3 + 2*3 = 9
und
g(1025) = g(5)*g(5)*g(41) = 3*3*9 = 81
Testfälle
Hier sind die Werte von g bis zu 50 .
2 -> 1
3 -> 2
4 -> 1
5 -> 3
6 -> 2
7 -> 3
8 -> 1
9 -> 4
10 -> 3
11 -> 5
12 -> 2
13 -> 5
14 -> 3
15 -> 6
16 -> 1
17 -> 5
18 -> 4
19 -> 7
20 -> 3
21 -> 6
22 -> 5
23 -> 7
24 -> 2
25 -> 9
26 -> 5
27 -> 8
28 -> 3
29 -> 9
30 -> 6
31 -> 7
32 -> 1
33 -> 10
34 -> 5
35 -> 9
36 -> 4
37 -> 11
38 -> 7
39 -> 10
40 -> 3
41 -> 9
42 -> 6
43 -> 11
44 -> 5
45 -> 12
46 -> 7
47 -> 9
48 -> 2
49 -> 9
50 -> 9
quelle
15, 21, 25, 29, 33, 41
und ein paar mehr, aber ich kann kein wirkliches Muster zu warum finden.)a(2*n) = a(n)
, unda(2*n+1) = a(n) + a(n+1)
hält, wenn2*n+1
ist prime. Für viele andere ungerade Zahlen stimmen die Folgen wahrscheinlich zufällig überein.Antworten:
Haskell, 69 Bytes
Anwendungsbeispiel:
(#2) 1025
->81
Der Parameter
a
wird hochgezählt, bis er dividiertx
oder erreicht istx
(dhx
Primzahl). Es es ein Byte kürzer Test füra > x
und eine weitere Bedingung (adda < x
) mit dem Modul Test statt Testen aufa == x
, weil die früherer Bindungena
zux+1
, die in dem rekursiven Aufruf helfen. Vergleichen Sie:quelle
Jelly , 18 Bytes
Probieren Sie es online!
Dies ist im Grunde nur eine direkte Übersetzung der Spezifikation. (Nachdem ich ein bisschen darüber nachgedacht habe, vermute ich, dass es mehr Bytes als den direkten Ansatz gibt, wenn es eine geschlossene Formel zum Finden der Sequenz gibt.)
Erläuterung
Wir haben zwei gegenseitig rekursive Funktionen. Hier ist die Hilfsfunktion (die g (n) für Primzahl n berechnet ):
Und hier ist das Hauptprogramm, das g (n) für jedes n berechnet :
Wenn wir das Hauptprogramm für eine Primzahl aufrufen, ist alles ein No-Op mit Ausnahme von
Ç
, sodass in diesem Fall g (n) zurückgegeben wird. Der Rest des Programms behandelt das Verhalten für Composite n .quelle
JavaScript (ES6), 59 Byte
Prüfung
Code-Snippet anzeigen
quelle
Python 2,
8569 Bytesquelle
Gelee , 13 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Clojure, 126 Bytes
Yay! Es ist fast doppelt so lang wie die Python-Antwort!
Ungolfed und eine Erklärung:
quelle
(.indexOf (for [...] ...) x)
!(t 1025)
, vielleichtif
sollte das so sein:when
? Aber dannnth
leere Liste wirftIndexOutOfBoundsException
.Mathematica, 83 Bytes
Unbenannte rekursive Funktion eines positiven Integer-Arguments, die eine Ganzzahl zurückgibt. Letztendlich nicht ganz so kurz.
Tr[#0/@({#-1,#+1}/2)]
(in dem Fall, in dem die Eingabe prim ist) ruft die Funktion für beide Mitglieder des geordneten Paares auf{(#-1)/2,(#+1)/2}
und addiert die Ergebnisse; Dies ist in Ordnung, da die Funktion zum Beispiel bei(#-1)/2
und den gleichen Wert hat#-1
. Ruft1##&@@#0/@Divisors@#~Part~{2,-2}
auf ähnliche Weise die Funktion für den zweitkleinsten Divisor#
und seinen komplementären Divisor (den zweitgrößten Divisor) auf und multipliziert die Antworten miteinander.quelle
#0
in dieser Antwort .Clojure, 120 Bytes
Verwendet
:when
, um Teiler von zu erhaltenn
,F
ist,nil
wenn kein solcher Teiler gefunden wird (n
ist Primzahl).quelle
Python 2 , 62 Bytes
Probieren Sie es online!
quelle