Teilbare FakultÀten

Vor kurzem war ich von diesem Tweet aus der Farm Library völlig verblĂŒfft:


"Das passiert, wenn man nicht multipliziert, sondern in der FakultÀt teilt."

Als ich ihn sah, musste ich mein GeschĂ€ft aufgeben, mir ein Notizbuch schnappen und die Formel ĂŒberprĂŒfen. Der Entwurf des Ergebnisses schien logisch. Seit der multiplikativen Version n ! mit zunehmender n neigt zur Unendlichkeit, dann sollte die "teilende" Version gegen Null tendieren. Und  f r a c n 2 n ! verhĂ€lt sich so; Polynomfunktion n 2 wĂ€chst langsamer als eine Potenzfunktion n ! fĂŒr groß genug n ::

 frac11, frac42, frac96, frac1624, frac25120, frac36720, frac495040, frac6440320, frac81362880, frac1003628800


Aber warum nimmt das Teilungsergebnis die Form an?  fracn2n! ? Woher kommt es? n2 ?

Um diese Frage zu beantworten, musste ich das alte Trauma, das mit dem Studium der fraktionierten Teilung verbunden war, abbauen, aber ich kam mit dem Schmerz zurecht. Wenn wir von der Tweet-Formel von links nach rechts gehen, erhalten wir zuerst  fracnn−1 . Teilen Sie dann diesen Wert durch n−2 wir bekommen

 cfrac fracnn−1n−2= fracn(n−1)(n−2)


Wenn wir so weitermachen, erhalten wir:

n mathbin/(n−1) mathbin/(n−2) mathbin/(n−3) mathbin/ cdots mathbin/1= fracn(n−1)(n−2)(n−3) cdots1= fracn(n−1)!


Um das im Tweet angezeigte Ergebnis zu erhalten  fracn2n! Wir multiplizieren nur den ZĂ€hler und den Nenner mit n . (Obwohl fĂŒr meinen Geschmack der Ausdruck  fracn(n−1)! klarer.)



Ich bin ein offiziell anerkannter FakultĂ€tsfan. Behalten Sie Ihre Fibonacci-Sequenzen bei sich; Hier ist mein Lieblingsfeature. Jedes Mal, wenn ich eine neue Programmiersprache lerne, besteht meine erste Übung darin, mehrere Verfahren zur Berechnung der FakultĂ€ten zu schreiben. Im Laufe der Jahre habe ich mir verschiedene Variationen dieses Themas ausgedacht, zum Beispiel einen Ersatz in der Definition  times auf + (was uns dreieckige Zahlen gibt). Aber anscheinend habe ich noch nie darĂŒber nachgedacht, etwas zu ersetzen  times auf  mathbin/ . Es stellt sich als seltsam heraus. Da die Multiplikation kommutativ und assoziativ ist, können wir definieren n! genauso wie das Produkt aller ganzen Zahlen aus 1 vorher n ohne sich um die Reihenfolge der Operationen zu sorgen. Beim Teilen kann die Reihenfolge jedoch nicht ignoriert werden. Im allgemeinen Fall x mathbin/y ney mathbin/x und (x mathbin/y) mathbin/z nex mathbin/(y mathbin/z) .

Im Tweet der Farm Library sind die Teiler in absteigender Reihenfolge: n,n−1,n−2, ldots,1 . Am offensichtlichsten wird dies durch eine aufsteigende Reihenfolge ersetzt: 1,2,3, ldots,n . Was passiert, wenn wir die FakultĂ€t der Teilung als definieren 1 mathbin/2 mathbin/3 mathbin/ cdots mathbin/n ? Eine weitere RĂŒckkehr zum Bruchteilungsalgorithmus der Schule gibt uns eine einfache Antwort:

1 mathbin/2 mathbin/3 mathbin/ cdots mathbin/n= frac12 mal3 mal4 mal cdo t s m a l n  = f r a c 1 n ! 


Mit anderen Worten, wenn wir viele Male teilen, zĂ€hlen wir ab 1 vorher n ist das Endergebnis gleich dem Kehrwert n ! . (Ich möchte am Ende dieses Satzes ein Ausrufezeichen setzen, aber leider!) Wenn Sie nach einer kanonischen Antwort auf die Frage suchen: „Was bekommen wir, wenn wir teilen, anstatt zu multiplizieren? n ! ? ", Dann wĂŒrde ich das sagen  f r a c 1 n ! Ist ein besserer Kandidat als  f r a c n ( n - 1 ) ! . Warum akzeptieren wir nicht die Symmetrie zwischen n ! und sein umgekehrter Wert?

NatĂŒrlich gibt es viele andere Möglichkeiten, n ganzzahlige Werte in die Menge einzufĂŒgen \ {1 \ ldots n \} . Aber wie viel genau? Wie sich herausstellte, genau n! ! Daher scheint es, dass es gibt n! einzigartige Möglichkeiten zur Definition einer Teilungsfunktion n! . Wenn wir jedoch die Antworten der beiden oben gezeigten Permutationen studieren, verstehen wir, dass hier ein einfacheres Muster funktioniert. Welches Element der Sequenz auch immer zuerst erscheint, es erscheint im ZĂ€hler eines großen Bruchs, und das Produkt aller anderen Elemente ist der Nenner. Daher gibt es am Ende nur n unterschiedliche Ergebnisse (vorausgesetzt, wir fĂŒhren Divisionsoperationen immer ausschließlich von links nach rechts durch). FĂŒr jede ganze Zahl k im Bereich von 1 vorher n durch Einstellen k Am Anfang der Zeile erstellen wir eine Teilung n! gleich k geteilt durch alle anderen Faktoren. Sie können dies wie folgt schreiben:

 cfrack fracn!k, text,derin frack2n!$konvertiertwerdenkan


Und so haben wir ein kleines RĂ€tsel gelöst, wie in diesem Tweet  fracn(n−1)! verwandelte sich in  fracn2n! .
Es ist erwĂ€hnenswert, dass alle diese Funktionen gegen Null konvergieren, wenn n bis unendlich. Aus asymptotischer Sicht  frac12n!, frac22n!, ldots, fracn2n! identisch.



Ja! Mission erfĂŒllt. Das Problem ist gelöst. Die Arbeit ist erledigt. Jetzt wissen wir alles, was wir zum Teilen von FakultĂ€ten brauchen, oder?

Nun, vielleicht gibt es noch eine Frage. Was sagt der Computer? Wenn wir unseren bevorzugten faktoriellen Algorithmus verwenden und das tun, was in einem Tweet vorgeschlagen wird, ersetzen Sie alle Vorkommen des Operators  times (oder * ) am / , was wird passieren? Welche von n Teilungsoptionen n! Wird uns das Programm geben?

Hier ist mein Lieblingsalgorithmus zur Berechnung von FakultĂ€ten als Programm fĂŒr Julia :

 function mul!(n) if n == 1 return 1 else return n * mul!(n - 1) end end 

Dieser Algorithmus fĂŒhrte ganze Generationen von Nerds in das Konzept der Rekursion ein. In Textform lautet es: if n gleich 1 dann mul!(n) gleich 1 . Andernfalls mĂŒssen Sie die Funktion berechnen mul!(n−1) und multiplizieren Sie dann das Ergebnis mit n .

Sie können fragen, was passiert, wenn n wird Null oder negativ sein. Sie können fragen, aber es ist besser, dies nicht zu tun. FĂŒr unsere aktuellen Ziele n in mathbbN .

Beginnend mit einem positiven n wird die Folge von rekursiven Aufrufen frĂŒher oder spĂ€ter auf fallen n=1 .

Eine Funktion kann mit dem einzeiligen Julia-Definitionsstil prÀgnanter geschrieben werden:

 mul!(n) = n == 1 ? 1 : n * mul!(n - 1) 

Ist der rechte Teil des Zuweisungsoperators ein bedingter Ausdruck oder ein ternÀrer Operator der Form a ? b : c a ? b : c . Hier ist a die boolesche Bedingung des Tests, die entweder true oder false . Wenn a true , wird Ausdruck b ausgewertet und das Ergebnis wird zum Wert des gesamten Ausdrucks. Andernfalls wird c berechnet.

Um sicherzugehen, dass ich alles richtig gemacht habe, sind hier die ersten 10 FakultÀten, die von diesem Programm berechnet wurden:

 [mul!(n) for n in 1:10] 10-element Array{Int64,1}: 1 2 6 24 120 720 5040 40320 362880 3628800 

Lassen Sie uns nun diese Definition Àndern und das einzige Vorkommen * in / transformieren, wobei alles andere unverÀndert bleibt (mit Ausnahme des Namens der Funktion).

 div!(n) = n == 1 ? 1 : n / div!(n - 1) 

Und das gibt das Programm zurĂŒck, wenn wir es fĂŒr die Werte ausfĂŒhren n von 1 vorher 20 ::

 [div!(n) for n in 1:20] 20-element Array{Real,1}: 1 2.0 1.5 2.6666666666666665 1.875 3.2 2.1875 3.657142857142857 2.4609375 4.063492063492063 2.70703125 4.432900432900433 2.9326171875 4.773892773892774 3.14208984375 5.092152292152292 3.338470458984375 5.391690662278897 3.523941040039063 5.675463855030418 

Was? Es ist definitiv nicht so, als wĂŒrde man gegen Null konvergieren  frac1n! oder  fracnn−1 . TatsĂ€chlich sehen die Werte nicht so aus, weil sie nicht konvergieren werden. Nach der folgenden Grafik zu urteilen, besteht die Sequenz aus zwei verschachtelten Komponenten, von denen jede langsam gegen unendlich zu wachsen scheint und auch von der anderen abweicht.


Wenn Sie verstehen, was wir hier beobachten, ist es hilfreich, den Ausgabetyp der div! Funktion zu Ă€ndern div! . Anstatt den Divisionsoperator / , der den Wert als Gleitkommazahl zurĂŒckgibt, können wir ihn durch den Operator // ersetzen, der den exakten rationalen Wert zurĂŒckgibt, der auf den niedrigsten Term gerundet ist.

 div!(n) = n == 1 ? 1 : n // div!(n - 1) 

Hier ist eine Folge von Werten fĂŒr n 1:20 :

 20-element Array{Real,1}: 1 2//1 3//2 8//3 15//8 16//5 35//16 128//35 315//128 256//63 693//256 1024//231 3003//1024 2048//429 6435//2048 32768//6435 109395//32768 65536//12155 230945//65536 262144//46189 

Die Liste ist voller interessanter Muster. Dies ist eine Doppelhelix, bei der sich gerade und ungerade Zahlen im Zickzack in komplementĂ€ren FĂ€den bewegen. Gerade Zahlen sind nicht nur gerade, sie sind alle Grade 2 . Außerdem erscheinen sie paarweise - zuerst im ZĂ€hler, dann im Nenner - und ihre Reihenfolge nimmt nicht ab. Aber es gibt LĂŒcken; Nicht alle AbschlĂŒsse sind vorhanden 2 . Der ungerade Thread sieht noch komplexer aus, verschiedene kleine einfache Koeffizienten erscheinen und verschwinden in den Zahlen. (Primzahlen mĂŒssen klein sein, zumindest weniger n .)

Dieses Ergebnis hat mich ĂŒberrascht. Ich erwartete eine viel mildere Sequenz, wie ich sie auf Papier berechnet hatte. All diese kaputten SprĂŒnge machten keinen Sinn. Auch der allgemeine Trend zu unbegrenztem Wachstum der Quote machte keinen Sinn. Wie können wir uns stĂ€ndig teilen, wĂ€hrend wir alle immer grĂ¶ĂŸeren Zahlen erhalten?

An diesem Punkt können Sie das Lesen unterbrechen und versuchen, eine eigene Theorie darĂŒber zu erstellen, woher diese Zick-Zack-Zahlen stammen. Wenn Sie einen Hinweis benötigen, dann haben Sie ihn und einen sehr starken, fast einen Spoiler: Suchen Sie in der Online-EnzyklopĂ€die der ganzzahligen Sequenzen nach einer Folge von ZĂ€hlern oder einer Folge von Nennern.



Hier ist ein weiterer Hinweis. Eine kleine Änderung im div! Programm div! konvertiert die Ausgabe vollstĂ€ndig. Ändern Sie einfach den letzten Ausdruck, indem Sie n // div!(n - 1) durch div!(n - 1) // n ersetzen.

 div!(n) = n == 1 ? 1 : div!(n - 1) // n 

Jetzt sehen die Ergebnisse so aus:

 10-element Array{Real,1}: 1 1//2 1//6 1//24 1//120 1//720 1//5040 1//40320 1//362880 1//3628800 

Dies ist die Umkehrfunktion der FakultĂ€t, die wir bereits gesehen haben, eine Reihe von Werten, die erzeugt werden, indem in einer zunehmenden Folge von Teilern von links nach rechts gegangen wird 1 mathbin/2 mathbin/3 mathbin/ cdots mathbin/n .

Es ĂŒberrascht nicht, dass das Ändern des letzten Ausdrucks in einer Prozedur das Ergebnis Ă€ndert. Am Ende wissen wir, dass die Teilung weder kommutativ noch assoziativ ist. Es ist jedoch schwer zu verstehen, warum die vom ursprĂŒnglichen Programm erzeugte Folge von Werten eine so seltsame Zick-Zack-Form ergibt. Welcher Mechanismus fĂŒhrt zu solchen gepaarten Zweierpotenzen und abwechselnden ungeraden und geraden Werten?

Ich fand, dass es in einer iterativen Version der Prozedur einfacher ist zu erklĂ€ren, was in einer Zick-Zack-Sequenz passiert, als in einer rekursiven. (Diese Aussage mag fĂŒr diejenigen Ă€rgerlich erscheinen, die rekursive Definitionen einfacher finden, aber es ist einfach passiert.) So sieht das Programm aus:

 function div!_iter(n) q = 1 for i in 1:n q = i // q end return q end 

Ich erklĂ€re, dass diese Prozedur mit einem Funktionszyklus mit einer rekursiven Funktion identisch ist, in dem Sinne, dass wenn div!(n) und div!_iter(n) ein Ergebnis fĂŒr eine positive ganze Zahl n , es immer dasselbe sein wird. Hier ist mein Beweis:

 [div!(n) for n in 1:20] [div!_iter(n) for n in 1:20] 1 1//1 2//1 2//1 3//2 3//2 8//3 8//3 15//8 15//8 16//5 16//5 35//16 35//16 128//35 128//35 315//128 315//128 256//63 256//63 693//256 693//256 1024//231 1024//231 3003//1024 3003//1024 2048//429 2048//429 6435//2048 6435//2048 32768//6435 32768//6435 109395//32768 109395//32768 65536//12155 65536//12155 230945//65536 230945//65536 262144//46189 262144//46189 

BerĂŒcksichtigen Sie die sequentiellen Werte der Variablen, um den Prozess zu verstehen, der diese Zahlen generiert i und q jedes Mal, wenn Sie eine Schleife ausfĂŒhren. UrsprĂŒnglich i und q sind gleich 1 ;; daher ergibt sich nach dem ersten Durchgang des Zyklus der Ausdruck q = i // q q Wert  frac11 . Dann i=2 und q= frac11 das heißt, eine neue Bedeutung q gleich  frac21 . In der dritten Iteration i=3 und q= frac21 das gibt uns  fraciq rightarrow frac32 . Wenn dies immer noch verwirrend ist, dann stellen Sie sich vor  fraciq wie i times frac1q . Eine wichtige Beobachtung hierbei ist, dass bei jedem Schleifenzyklus q bekommt den entgegengesetzten Wert, wird  frac1q .

Wenn Sie diese Operationen erweitern und die Multiplikationen und Divisionen betrachten, die in jedem Element der Reihe enthalten sind, entsteht ein Muster:

 frac11, quad frac21, quad frac1 cdot32, quad frac2 cdot41 cdot3, quad frac1 cdot3 cdot52 cdot4 quad frac2 cdot4 cdot61 cdot3 cdot5



In allgemeiner Form:

 frac1 cdot3 cdot5 cdot cdots cdotn2 cdot4 cdot cdots cdot(n−1) quad( textoddn) qquad frac2 cdot4 cdot6 cdot cdots cdotn1 cdot3 cdot5 cdot cdots cdot(n−1) quad( textgeraden)




Funktionen 1 cdot3 cdot5 cdot cdots cdotn fĂŒr ungerade n und 2 cdot4 cdot6 cdot cdots cdotn fĂŒr gerade n habe ihren eigenen Namen! Sie werden doppelte FakultĂ€ten genannt und als geschrieben n!! .

Schreckliche Terminologie, richtig? Es wĂ€re besser, wenn sie "semi-FakultĂ€t" genannt wĂŒrden. Und wenn ich es nicht wĂŒsste, wĂŒrde ich lesen n!! als FakultĂ€t FakultĂ€t.

Die doppelte FakultĂ€t n ist definiert als das Produkt von n und allen kleineren positiven ganzen Zahlen derselben ParitĂ€t. Unsere merkwĂŒrdige Folge von Zick-Zack-Werten ist also gerecht  fracn!!(n−1)!! .

Ein Artikel von Henry W. Gould und Jocelyn Quentens (leider hinter Paywall) aus dem Jahr 2012 befasst sich mit der Verwendung von Doppelfaktoren. Sie sind viel hÀufiger als Sie vielleicht denken. Mitte des 17. Jahrhunderts leitete John Wallis die folgende IdentitÀt ab:

 frac pi2= frac2 cdot2 cdot4 cdot4 cdot6 cdot6 cdots1 cdot3 cdot3 cdot5 cdot5 cdot7 cdots= limn rightarrow infty frac((2n)!!)2(2n+1)!!(2n−1)!!


Eine noch seltsamere Reihe mit einem WĂŒrfel aus doppelten FakultĂ€tswerten wird in zusammengefasst  frac2 pi . Er wurde von niemand anderem als Srinivasa Ramanujan entdeckt.

Gould und Kientens betrachteten auch das doppelte faktorielle Äquivalent fĂŒr Binomialkoeffizienten. Der Standard-Binomialkoeffizient ist definiert als:

 binomnk= fracn!k!(n−k)!


Die Dual-Version sieht folgendermaßen aus:

 left( binomnk right)= fracn!!k!!(n−k)!!


Beachten Sie, dass unsere Zick-Zack-Zahlen dieser Beschreibung entsprechen und daher als Binomialkoeffizienten von Doppelfaktoren betrachtet werden können. Genauer gesagt handelt es sich um solche Zahlen:

 left( binomn1 right)= left( binomnn−1 right)= fracn!!1!!(n−1)!!


Einfache Bohne  binomn1 nicht sehr interessant; er ist einfach gleich n . Aber die Doppelversion  left( binomn1 right) Wie wir gesehen haben, tanzt ein lebhafterer Tanz. Und im Gegensatz zum ĂŒblichen Binomial ist es nicht immer eine ganze Zahl. (Die einzigen ganzzahligen Werte sind 1 und 2 .)

Ein Blick auf Zickzackzahlen als Quotienten aus doppelten FakultĂ€ten erklĂ€rt einige ihrer Eigenschaften, beginnend mit abwechselnden geraden und ungeraden Werten. Wir können auch sehen, warum alle geraden Zahlen in der Sequenz Potenzen von 2 sind. Betrachten Sie das Beispiel mit n=6 . Der ZĂ€hler dieser Fraktion ist 2 cdot4 cdot6=48 Empfangen von 6 Multiplikator 3 . Aber der Nenner ist 1 cdot3 cdot5=$1 . Die Drillinge oben und unten schrumpfen und verlassen uns  frac165 . Solche Reduzierungen treten jeweils auf. Jedes Mal, wenn ein ungerader Faktor in der Folge von geraden Zahlen erscheint m hat es notwendigerweise die Form 2 cdotm aber zu diesem Zeitpunkt selbst m sollte bereits in einer Folge von ungeraden Zahlen erscheinen.



Ist eine Folge von Zickzackzahlen eine vernĂŒnftige Antwort auf die Frage: „Was passiert, wenn wir teilen, anstatt zu multiplizieren? n! ? " Oder hat sich das Computerprogramm, das sie generiert, als fehlerhafter Algorithmus herausgestellt? Meiner persönlichen Meinung nach  frac1n! - eine intuitivere Antwort, aber  fracn!!(n−1)!! - interessanter.

DarĂŒber hinaus erweitert die Existenz einer Zick-Zack-Sequenz unseren Horizont. Wie oben erwĂ€hnt, wenn Sie darauf bestehen, dass der Divisionsalgorithmus die Liste der ZĂ€hler immer in der richtigen Reihenfolge durchlĂ€uft n Bei jedem Schritt, bei dem die Zahl links durch die Zahl rechts geteilt wird, ergibt sich eine Summe n mögliche Ergebnisse, und sie sehen alle sehr Ă€hnlich aus. Die Zick-Zack-Lösung bietet jedoch viel grĂ¶ĂŸere Möglichkeiten. Wir können das Problem wie folgt formulieren: Nehmen Sie den Satz von ZĂ€hlern \ {1 \ dots n \} WĂ€hlen Sie die Teilmenge aus und invertieren Sie alle Elemente dieser Teilmenge. Jetzt multiplizieren wir alle ZĂ€hler, sowohl invers als auch direkt. Wenn die invertierte Teilmenge leer ist, ist das Ergebnis eine regulĂ€re FakultĂ€t n! . Wenn alle ZĂ€hler zu ihren Werten invers geworden sind, erhalten wir das Gegenteil  frac1n! . Und wenn jeder zweite ZĂ€hler konvertiert wird, beginnend mit n−1 Dann ist das Ergebnis ein Element einer Zick-Zack-Sequenz.

Dies sind nur einige der vielen verfĂŒgbaren Optionen. Insgesamt gibt es 2n Teilmengen von n Elemente. Zum Beispiel können Sie die Umkehrung jeder Zahl nehmen, die eine Primzahl oder eine Primzahl ist (2,3,4,5,7,8,9,11, Punkte) . Bei klein n Ergebnisse springen, bleiben aber stĂ€ndig kleiner als 1 ::


Wenn ich dieses Diagramm jedoch fĂŒr mehr fortsetzte n wĂŒrde er in die StratosphĂ€re abheben. Die Grade der Primzahlen werden auf der Zahlenlinie sehr spĂ€rlich.



Jetzt werde ich eine Frage stellen. Wir sahen faktorielle Variationen nahe Null als n zum Beispiel bis ins Unendliche 1/n! . Wir haben gesehen, dass andere Variationen mit zunehmender Anzahl zunehmen n unbegrenzt, auch ich n! und Zickzackzahlen. Gibt es Varianten des FakultÀtsprozesses, die zu einer endlichen Grenze konvergieren, die nicht Null ist?

ZunÀchst kam mir folgender Algorithmus in den Sinn:

 function greedy_balance(n) q = 1 while n > 0 q = q > 1 ? q /= n : q *= n n -= 1 end return q end 

Wir durchlaufen ganzzahlige Werte von n bis zu 1 Berechnung des aktuellen Produkts / Quotienten im Prozess q . Bei jedem Schritt ist der aktuelle Wert q mehr 1 teilen wir es durch den nĂ€chsten ZĂ€hler, andernfalls fĂŒhren wir die Multiplikation durch. Dieses Schema implementiert eine Art Feedback-Management oder Zielsuchverhalten. Wenn q Wenn wir zu groß werden, reduzieren wir es. Wenn es zu klein ist, erhöhen wir es. Ich schlug das vor, wĂ€hrend ich mich bemĂŒhte n bis unendlich q konvergiert zu einem sich stĂ€ndig verengenden Wertebereich neben 1 .

Aber das Experiment warf mir eine weitere Überraschung:


Eine solche SĂ€gezahnwelle ist nicht ganz das, was ich erwartet habe. Seltsamerweise ist die Kurve nicht symmetrisch 1 ;; Abweichungen von oben haben eine grĂ¶ĂŸere Amplitude als von unten. Diese Verzerrung ist jedoch eher visuell als mathematisch. Als q ist privat, Entfernung von 1 vorher 10 gleich wie Abstand von 1 vorher  frac110 aber auf einer linearen Skala sieht das nicht so aus. Sie können dies beheben, indem Sie ein logarithmisches Diagramm des Quotienten erstellen:


Jetzt ist der Graph symmetrisch oder zumindest ungefĂ€hr gleich und relativ zum Wert zentriert 0 Welches ist der Logarithmus 1 . Aber es bleibt ein ernsthafteres Geheimnis. Die SĂ€gezahnwelle ist sehr regelmĂ€ĂŸig und hat eine Periode 4 , ohne Anzeichen einer Kompression in Richtung des erwarteten Grenzwerts zu zeigen  logq=0 . Numerische Werte legen nahe, dass wann n bis unendlich konvergieren die Spitzen der Kurve zu einem etwas höheren Wert q= frac53 und die Tiefs nĂ€hern sich einem etwas niedrigeren Wert q= frac35 . (Entsprechende Basislogarithmen 10 sind ungefĂ€hr gleich  pm0.222 ) Ich konnte nicht herausfinden, warum dies geschieht. Vielleicht kann jemand erklĂ€ren.

Ein Fehler mit diesem gierigen Algorithmus bedeutet nicht, dass wir die faktorielle Konvergenz nicht teilen können q=1 .

Wenn wir mit den Logarithmen von ZĂ€hlern arbeiten, wird dieses Verfahren zum Fall eines bekannten Rechenproblems, das als "Problem der Aufteilung einer Menge von Zahlen" bezeichnet wird. Wir erhalten viele reelle Zahlen, und wir mĂŒssen sie in zwei Mengen aufteilen, deren Summe gleich oder der Gleichheit so nahe wie möglich kommt. Dies ist eine nachweislich schwierige Aufgabe, wird aber auch ( PDF ) als "einfachste komplexe Aufgabe" bezeichnet.

FĂŒr jeden n Wir können feststellen, dass wir bei Verwendung der inversen Werte einer anderen Teilmenge von ZĂ€hlern eine bessere AnnĂ€herung an erhalten n!=1 . FĂŒr kleine n Wir können dieses Problem mit brutaler Gewalt lösen: Betrachten Sie einfach alles 2n Teilmengen und wĂ€hlen Sie die besten.

Ich habe die optimalen Partitionen bis berechnet n=30 wenn Sie aus einer Milliarde Optionen auswĂ€hlen mĂŒssen.


Offensichtlich wird die Grafik flacher. Sie können dieselbe Methode verwenden, um die Konvergenz zu einem anderen Wert im Bereich von zu erzwingen 0 vorher n! .

Und so bekommen wir eine weitere Antwort auf die Frage von Tweet und haben unsere Reise begonnen. Was passiert, wenn wir teilen und nicht multiplizieren? n! ? Alles was wir wollen.

Source: https://habr.com/ru/post/de440512/


All Articles