Die Ableitung einer Funktion ist ein Eckpfeiler von Mathematik, Ingenieurwissenschaften, Physik, Biologie, Chemie und einer Vielzahl anderer Wissenschaften. Heute werden wir etwas berechnen, das nur tangential zusammenhängt: die arithmetische Ableitung.
Definition
Die arithmetische Ableitung a(n)
oder n'
wird hier ( A003415 ) durch eine Reihe von Eigenschaften definiert, die der Ableitung einer Funktion ähnlich sind.
a(0) = a(1) = 0
,a(p) = 1
Wop
ist eine Primzahl, unda(mn) = m*a(n) + n*a(m)
.
Die dritte Regel wird zur Differenzierung von Funktionen auf die Produktregel zugrunde: für Funktionen f(x)
und g(x)
, (fg)' = f'g + fg'
. Also mit Zahlen (ab)' = a'b + ab'
.
Es ist auch zu beachten, dass a(-n) = -a(n)
die Eingabe negativ sein kann, da die arithmetische Ableitung über diese einfache Beziehung auf die negativen Zahlen erweitert werden kann.
Regeln
- Schreiben Sie ein Programm oder eine Funktion, die bei einer beliebigen Ganzzahl
n
die arithmetische Ableitung von zurückgibtn
. - Eingaben werden sein , um Probleme mit ganzzahligen Größen und Zahlen zu vermeiden, die zu groß sind, um einen angemessenen Zeitraum zu berücksichtigen. Ihr Algorithmus sollte theoretisch in der Lage sein, die arithmetische Ableitung von Zahlen außerhalb dieses Bereichs zu berechnen.
-230 < n < 230
- Eingebaute Funktionen für symbolische Mathematik, Primfaktorisierung und Differenzierung sind zulässig.
Beispiele
> a(1)
0
> a(7)
1
> a(14) # a(7)*2 + a(2)*7 = 1*2 + 1*7 = 9
9
> a(-5) # a(-5) = -a(5) = -1
-1
> a(8) # a(8) = a(2**3) = 3*2**2 = 12
12
> a(225) # a(225) = a(9)*25 + a(25)*9 = 6*25 + 10*9 = 150 + 90 = 240
240
> a(299792458) # a(299792458) = a(2)*149896229 + a(7)*42827494 + a(73)*4106746 + a(293339)*1022 = 1*149896229 + 1*42827494 + 1*4106746 + 1*1022 = 149896229 + 42827494 + 4106746 + 1022 = 196831491
196831491
Wie immer, wenn das Problem unklar ist, lassen Sie es mich bitte wissen. Viel Glück und gutes Golfen!
quelle
prime
drina(prime)
? Ist es nur eine Primzahl?Antworten:
MATL , 12 Bytes
Probieren Sie es online!
Erläuterung
Betrachte eine ganze Zahl a mit | a |> 1 und lassen Sie die (möglicherweise wiederholten) Primfaktoren von | a | sei f 1 , ..., f n . Dann ist das gewünschte Ergebnis a · (1 / f 1 + ... + 1 / f n ).
quelle
1
gibt1
als „Prime“ Nummer Zersetzung. Es ist ein seltsames Ergebnis (ein leeres Array wäre sinnvoller). Aber so funktioniert Matlab. Und auch CJam. Es muss also einen guten Grund geben,1
in diesem Fall auszugeben . Was denkst du? Ich war versucht, dieYf
Funktion zur Ausgabe eines leeren Arrays für neu zu definieren1
, aber ich war mir nicht sicherPython, 59 Bytes
Eine rekursive Funktion. Bei großen Eingaben ist die Stack-Tiefe auf typischen Systemen unzureichend, es sei denn, Sie verwenden Stackless Python .
Die rekursive Definition wird direkt implementiert und zählt bis zur Suche nach Kandidatenprimfaktoren. Da
f(prime)=1
, wennn
eine Primzahlp
als Faktor hat, haben wirf(n) == p*f(n/p)+n/p
.quelle
Gelee,
87 Bytes-1 Byte von @Dennis
Verwendet die gleiche Formel wie alle anderen. Es gibt jedoch einen kleinen Trick, mit dem man umgehen muss
0
.Probieren Sie es hier aus .
quelle
Python 2,
87787674 BytesVerbesserungen dank @Maltysen:
Weitere Verbesserung um zwei Bytes:
Weitere Verbesserung dank @xnor:
Erläuterung
Die arithmetische Ableitung von
a
ist gleicha
der Summe der Kehrwerte der Primfaktoren vona
. Es ist keine Ausnahme für 1 erforderlich, da die Summe der Kehrwerte der Primfaktoren von 1 Null ist.quelle
abs(a)>1
kann seina*a>1
.d,s = 2,0
Haskell,
20390 BytesVielen Dank @nimi!
Ich habe immer noch keine Ahnung, wann welche Einschnitte welche Interpretation verursachen, dies ist die kürzeste, die ich bisher geschafft habe, und wie immer bin ich sicher, dass es viel mehr Golf spielen kann. Ich werde es am Abend noch einmal versuchen.
quelle
J,
302719 ZeichenVielen Dank an @Dennis für das Abhacken von 3 Zeichen.
Vielen Dank an @Zgarb für das Abhacken von 8 Zeichen.
Probieren Sie es online!
Beispieleingabe:
Wie es funktioniert:
quelle
Pyth -
108 BytesLiebt den impliziten Input! Sollte es für die meisten Dinge mit Jelly auf Augenhöhe bringen (außer Dennis 'Golffähigkeiten).
Test Suite .
quelle
Haskell, 59 Bytes
Implementiert die rekursive Definition direkt mit einer Hilfsvariablen
p
, die bis zur Suche nach potenziellen Primfaktoren ab zählt2
. Die letzte Zeile ist die Hauptfunktion, diep=2
an die in der ersten Zeile definierte Binärfunktion anschließt.Die Funktion prüft jeweils nacheinander:
n*n<2
, dannn
ist einer von-1,0,1
und das Ergebnis ist0
.n
nicht ein Vielfaches von istp
, erhöhenp
und fortfahren.n=p*r
und durch die "derivative" Eigenschaft ergibt sich das Ergebnisr*a(p)+p*a(r)
, was vereinfacht,r+p*a(r)
weilp
es prime ist.Der letzte Fall speichert Bytes , die durch die Bindung
r
in einer Wache , die auch das vermeidet1>0
die vorformuliertenotherwise
. Wennr
früher gebunden werdenmod n p>0
könnte, könnte die zweite Bedingung als überprüft werdenr*p==n
, was 3 Bytes kürzer ist, aber ich verstehe nicht, wie das geht.quelle
Im Ernst ,
17141112 BytesMeine allererste ernsthafte Antwort. Diese Antwort basiert auf Luis Mendos MATL-Antwort und der Idee, dass die arithmetische Ableitung einer Zahl
m
gleich ist, wo sich jeder Primfaktor der Multiplizität befindet. Mein Zusatz ist zu beachten, dass, wenn , dannm·(1/p1 + 1/p2 + ... + 1/pn)
p1...pn
n
m = p1e1·p2e2·...·pnen
a(m) = m·(e1/p1 + e2/p2 + ... + en/pn)
. Vielen Dank an Mego für die Hilfe beim Golfen und bei der Fehlerbehebung. Probieren Sie es online!Ungolfing:
quelle
Japt -X ,
161310 Bytes- 6 Bytes dank @Shaggy
Probieren Sie es online!
quelle
N.k()
nicht funktionieren.-x
Flagge.APL (Dyalog Extended) ,
139 BytesEine einfache Lösung. Die Dyalog Unicode-Version war einfach eine längere Version davon und wurde daher weggelassen.
Bearbeiten: 4 Bytes gespart, indem die Methode in Lirtosiast's Jelly-Lösung übernommen wurde .
Probieren Sie es online!
Ungolfing
quelle
Ruby,
876680757068 BytesDiese Antwort basiert auf der MATL-Antwort von Luis Mendo , der Python-Antwort von Wythagoras und der Vorstellung, dass die arithmetische Ableitung einer Zahl
m
gleich ist, wo sich jeder Primfaktor der Multiplizität befindet.m·(1/p1 + 1/p2 + ... + 1/pn)
p1...pn
n
Diese Funktion wird folgendermaßen aufgerufen:
Ungolfing:
quelle
Julia,
7243 BytesDies ist eine anonyme Funktion, die eine Ganzzahl akzeptiert und einen Gleitkommawert zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.
Für eine Eingang ganzer Zahl n , wenn n 2 ≤ 1 return 0 sonst ist die prime Faktorisierung erhalten n 2 als a
Dict
, dann für jedes Ansaug- / Exponenten Paar, unterteilen die prime durch seine Exponenten, dann teilen n durch das Ergebnis. Dies ist nur Rechen n x / p , wobei p der wichtigste Faktor ist , und x ist die Exponenten, die die gleichen wie Summieren ist n / p , x - mal. Wir addieren das resultierende Array und dividieren es durch 2, da wir doppelt so viel summiert haben, wie wir brauchen. Das liegt an der Tatsache, dass wir n 2 faktorisiereneher als n |.). (Das ist ein Byte kürzer als Factoring | n29 Bytes gespart dank Dennis!
quelle
Jolf, 13 Bytes
Ein großes Lob an die MATL-Antwort für den Algorithmus! Versuchen Sie es hier , oder testen sie alle auf einmal . (Gibt [key, out] in einem Array aus.)
Erläuterung
quelle
Mathematica 10.0, 39 Bytes
quelle
FactorInteger@1
ergibt sich{1,1}
, so dass dieIf
Funktion nicht mehr benötigt wird und 10 Bytes eingespart werden.{{1,1}}
von meiner Version zurückgegeben wird ({}
ist das erwartete Ergebnis für mich).APL (NARS), 35 Zeichen, 70 Byte
Test und wie man es benutzt:
Ich dachte, dass es nicht in Ordnung wäre, weil ich nicht weiß, ob die Variable c zusammengesetzt ist (und keine Primzahl) ... Scheint aber in Ordnung für den Test ...
quelle
05AB1E ,
74 BytesPort of Lirtosiast 's Jelly Antwort .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Perl 5, 62 Bytes
Verwendet die Formel (aus OEIS):
If n = Product p_i^e_i, a(n) = n * Sum (e_i/p_i).
quelle
Perl 6, 90
Dies kann bei großen Zahlen etwas langsam sein. Ersetzen Sie
2..^n
durch2..n.sqrt
für längeren Code, aber schnellere Berechnung.quelle
Tinte , 183 Bytes
Probieren Sie es online!
Ich weigere mich zu glauben, dass dies eine gute Lösung ist, aber ich sehe auch keinen Weg, sie zu verbessern.
quelle
Pari / GP , 45 Bytes
Probieren Sie es online!
quelle