Problem Summary

Let \(E_n=(\mathbb{Z}_{>0})^n\). For two positive-integer vectors \(u=(u_1,\dots,u_n)\) and \(v=(v_1,\dots,v_n)\), define

$$\langle u,v\rangle=\sum_{i=1}^{n}u_iv_i,\qquad u\star v=\prod_{i=1}^{n}(u_i+v_i).$$

The quantity \(R_n(M)\) is the sum of \(u\star v\) over all ordered pairs \((u,v)\in E_n\times E_n\) satisfying \(\langle u,v\rangle=M\). The target is

$$R_6(10000!) \pmod{10^9+7}.$$

A direct enumeration of six-dimensional vector pairs is hopeless, so the solution converts the problem into coefficient extraction from a generating function and then reduces that generating function with quasimodular-form identities.

Mathematical Approach

The computation rests on two ideas: first, each coordinate contributes independently through a one-variable divisor sum; second, the sixth power of the resulting generating series can be rewritten in a weight-12 quasimodular basis whose coefficients are easy to evaluate at \(10000!\).

Step 1: Collapse One Coordinate to a Divisor Sum

For \(n=1\), the condition \(\langle u,v\rangle=M\) is simply \(uv=M\). Every divisor \(d\mid M\) gives the ordered pair \((d,M/d)\), whose contribution to \(u\star v\) is

$$d+\frac{M}{d}.$$

Therefore

$$R_1(M)=\sum_{d\mid M}\left(d+\frac{M}{d}\right)=2\sum_{d\mid M}d=2\sigma_1(M),$$

where \(\sigma_1(M)\) is the usual sum-of-divisors function.

Step 2: Turn Six Coordinates into an Additive Convolution

For a general pair of vectors, set

$$m_i=u_iv_i \qquad (1\le i\le n).$$

Then

$$m_1+\cdots+m_n=M,$$

and for a fixed decomposition \(M=m_1+\cdots+m_n\), the contributions from the coordinates multiply. Hence

$$R_n(M)=\sum_{\substack{m_1+\cdots+m_n=M\\m_i\ge 1}}R_1(m_1)\cdots R_1(m_n).$$

If we define the generating series

$$G(q)=\sum_{m\ge 1}R_1(m)q^m,$$

then this is exactly the \(n\)-fold additive convolution identity

$$R_n(M)=[q^M]\,G(q)^n.$$

Step 3: Replace the Generating Series by Eisenstein Series

The normalized quasimodular Eisenstein series \(E_2\) satisfies

$$E_2(q)=1-24\sum_{m\ge 1}\sigma_1(m)q^m.$$

Since \(R_1(m)=2\sigma_1(m)\), we obtain

$$G(q)=2\sum_{m\ge 1}\sigma_1(m)q^m=\frac{1-E_2(q)}{12}.$$

For the required dimension \(n=6\), this gives

$$R_6(M)=[q^M]\left(\frac{1-E_2(q)}{12}\right)^6.$$

Because \(M=10000!>0\), the constant term contributes nothing, so the task becomes the extraction of the positive-\(q\) coefficients of powers of \(E_2\).

Step 4: Reduce Powers of \(E_2\) in Weight 12

Write

$$D=q\frac{d}{dq}.$$

For any series \(f(q)=\sum_{m\ge 0}a_mq^m\), we have

$$[q^M]D^r f=M^r a_M.$$

The implementation uses the standard quasimodular reductions

$$E_2^2=E_4+12DE_2,$$

$$E_2^3=E_6+9DE_4+72D^2E_2,$$

$$E_2^4=E_8+8DE_6+\frac{216}{5}D^2E_4+288D^3E_2,$$

$$E_2^5=E_{10}+\frac{15}{2}DE_8+\frac{240}{7}D^2E_6+144D^3E_4+864D^4E_2,$$

$$E_2^6=E_{12}-\frac{4608}{24185}\Delta+\frac{36}{5}DE_{10}+30D^2E_8+\frac{720}{7}D^3E_6+\frac{2592}{7}D^4E_4+\frac{10368}{5}D^5E_2.$$

Here \(\Delta(q)=\sum_{m\ge 1}\tau(m)q^m\) is the discriminant cusp form. The positive-\(q\) coefficients of the Eisenstein series are

$$[q^M]E_2=-24\sigma_1(M),\qquad [q^M]E_4=240\sigma_3(M),\qquad [q^M]E_6=-504\sigma_5(M),$$

$$[q^M]E_8=480\sigma_7(M),\qquad [q^M]E_{10}=-264\sigma_9(M),\qquad [q^M]E_{12}=\frac{65520}{691}\sigma_{11}(M),$$

and

$$[q^M]\Delta=\tau(M).$$

So every coefficient needed for \((1-E_2)^6\) becomes a linear combination of \(M^r\sigma_{2k-1}(M)\) and \(\tau(M)\).

Step 5: Evaluate the Arithmetic Data at \(M=10000!\)

Let \(N=10000\). For every prime \(p\le N\), Legendre's formula gives the exponent of \(p\) in \(N!\):

$$v_p(N!)=\sum_{t\ge 1}\left\lfloor\frac{N}{p^t}\right\rfloor.$$

Thus

$$10000!=\prod_{p\le 10000}p^{v_p(10000!)}.$$

For every odd \(r\in\{1,3,5,7,9,11\}\), multiplicativity gives

$$\sigma_r(10000!)=\prod_{p\le 10000}\left(1+p^r+\cdots+p^{r\,v_p(10000!)}\right)=\prod_{p\le 10000}\frac{p^{r(v_p(10000!)+1)}-1}{p^r-1}.$$

The Ramanujan tau function is multiplicative as well, so

$$\tau(10000!)=\prod_{p^e\parallel 10000!}\tau(p^e),$$

with the prime-power recurrence

$$\tau(p^e)=\tau(p)\tau(p^{e-1})-p^{11}\tau(p^{e-2}).$$

To obtain the prime values \(\tau(p)\), the implementation first builds the sequence \(\tau(n)\) up to \(10000\) from

$$\tau(1)=1,\qquad (n-1)\tau(n)=-24\sum_{k=1}^{n-1}\sigma_1(k)\tau(n-k)\qquad (n\ge 2).$$

Worked Example: \(R_1(10)\) and \(R_2(3)\)

For \(M=10\), the divisor pairs are \((1,10)\), \((2,5)\), \((5,2)\), and \((10,1)\). Their contributions are \(11\), \(7\), \(7\), and \(11\), so

$$R_1(10)=11+7+7+11=36=2(1+2+5+10).$$

Now use convolution for \(n=2\) and \(M=3\). The only decompositions into positive parts are \(3=1+2\) and \(3=2+1\). Since \(R_1(1)=2\) and \(R_1(2)=2(1+2)=6\), we get

$$R_2(3)=R_1(1)R_1(2)+R_1(2)R_1(1)=2\cdot 6+6\cdot 2=24.$$

This small case shows exactly why generating functions turn the problem into a power of one basic series.

How the Code Works

The C++, Python, and Java implementations all follow the same pipeline. First they sieve the primes up to \(10000\) and compute every \(v_p(10000!)\). From those exponents they evaluate \(\sigma_1,\sigma_3,\sigma_5,\sigma_7,\sigma_9,\sigma_{11}\) multiplicatively modulo \(10^9+7\), and they also compute \(10000! \bmod (10^9+7)\) so that the factors \(M,M^2,\dots,M^5\) needed after differentiation are available.

Next the implementation builds \(\sigma_1(n)\) for all \(1\le n\le 10000\), uses the recurrence above to obtain \(\tau(n)\) up to \(10000\), and then extends from prime values to prime powers through the second-order recurrence for \(\tau(p^e)\). A \(2\times 2\) matrix power is used to evaluate that recurrence efficiently for each prime power.

Finally the program substitutes all divisor sums, the \(\tau\) term, and the powers of \(10000!\) into the weight-12 reduction of \((1-E_2)^6\). The last step is division by \(12^6=2985984\), implemented modulo \(10^9+7\) by multiplying with the modular inverse.

Complexity Analysis

Let \(N=10000\). The prime sieve and the factorial valuations cost \(O(N\log\log N)\) time. Building the table of \(\sigma_1(n)\) by divisor accumulation costs \(O(N\log N)\). The recurrence for \(\tau(n)\) is quadratic, \(O(N^2)\), and this is the dominant step in the actual implementations. The remaining prime-product evaluations and prime-power recurrences are lower-order, roughly \(O(\pi(N)\log N)\). Memory usage is \(O(N)\).

Footnotes and References

  1. Problem page: https://projecteuler.net/problem=851
  2. Divisor function: Wikipedia - Divisor function
  3. Eisenstein series: Wikipedia - Eisenstein series
  4. Quasimodular form: Wikipedia - Quasimodular form
  5. Ramanujan tau function: Wikipedia - Ramanujan tau function
  6. Legendre's formula: Wikipedia - Legendre's formula

Problemzusammenfassung

Sei \(E_n=(\mathbb{Z}_{>0})^n\). Für zwei positive ganzzahlige Vektoren \(u=(u_1,\dots,u_n)\) und \(v=(v_1,\dots,v_n)\) sind definiert

$$\langle u,v\rangle=\sum_{i=1}^{n}u_iv_i,\qquad u\star v=\prod_{i=1}^{n}(u_i+v_i).$$

\(R_n(M)\) ist die Summe von \(u\star v\) über alle geordneten Paare \((u,v)\in E_n\times E_n\) mit \(\langle u,v\rangle=M\). Gesucht ist

$$R_6(10000!) \pmod{10^9+7}.$$

Direkte Enumeration ist aussichtslos. Deshalb formt die Lösung das Problem in eine Koeffizientenextraktion einer erzeugenden Funktion um und reduziert diese anschließend mit Identitäten aus der Theorie quasimodularer Formen.

Mathematischer Ansatz

Die Rechnung besteht aus zwei Schichten. Zuerst wird jede Koordinate auf eine eindimensionale Teilerfunktion zurückgeführt. Danach wird die sechste Potenz der entstehenden erzeugenden Reihe in eine Gewicht-12-Basis zerlegt, deren Koeffizienten bei \(10000!\) effizient ausgewertet werden können.

Schritt 1: Eine Koordinate als Teilersumme schreiben

Für \(n=1\) bedeutet \(\langle u,v\rangle=M\) einfach \(uv=M\). Jeder Teiler \(d\mid M\) liefert das geordnete Paar \((d,M/d)\) mit Beitrag

$$d+\frac{M}{d}.$$

Also gilt

$$R_1(M)=\sum_{d\mid M}\left(d+\frac{M}{d}\right)=2\sum_{d\mid M}d=2\sigma_1(M).$$

Schritt 2: Sechs Koordinaten ergeben eine additive Faltung

Für ein allgemeines Paar setzen wir

$$m_i=u_iv_i\qquad (1\le i\le n).$$

Dann ist

$$m_1+\cdots+m_n=M,$$

und für eine feste Zerlegung von \(M\) multiplizieren sich die Beiträge der einzelnen Koordinaten. Daher

$$R_n(M)=\sum_{\substack{m_1+\cdots+m_n=M\\m_i\ge 1}}R_1(m_1)\cdots R_1(m_n).$$

Mit der erzeugenden Reihe

$$G(q)=\sum_{m\ge 1}R_1(m)q^m$$

folgt unmittelbar

$$R_n(M)=[q^M]\,G(q)^n.$$

Schritt 3: Die erzeugende Reihe durch Eisenstein-Reihen ausdrücken

Für die quasimodulare Reihe \(E_2\) gilt

$$E_2(q)=1-24\sum_{m\ge 1}\sigma_1(m)q^m.$$

Wegen \(R_1(m)=2\sigma_1(m)\) erhalten wir

$$G(q)=2\sum_{m\ge 1}\sigma_1(m)q^m=\frac{1-E_2(q)}{12}.$$

Damit reduziert sich der Zielwert auf

$$R_6(M)=[q^M]\left(\frac{1-E_2(q)}{12}\right)^6.$$

Da \(M=10000!>0\) ist, spielt der konstante Term keine Rolle mehr; entscheidend sind also nur die positiven Koeffizienten der Potenzen von \(E_2\).

Schritt 4: Potenzen von \(E_2\) im Gewicht 12 reduzieren

Schreibe

$$D=q\frac{d}{dq}.$$

Für jede Reihe \(f(q)=\sum_{m\ge 0}a_mq^m\) gilt

$$[q^M]D^r f=M^r a_M.$$

Die verwendeten Reduktionsformeln sind

$$E_2^2=E_4+12DE_2,$$

$$E_2^3=E_6+9DE_4+72D^2E_2,$$

$$E_2^4=E_8+8DE_6+\frac{216}{5}D^2E_4+288D^3E_2,$$

$$E_2^5=E_{10}+\frac{15}{2}DE_8+\frac{240}{7}D^2E_6+144D^3E_4+864D^4E_2,$$

$$E_2^6=E_{12}-\frac{4608}{24185}\Delta+\frac{36}{5}DE_{10}+30D^2E_8+\frac{720}{7}D^3E_6+\frac{2592}{7}D^4E_4+\frac{10368}{5}D^5E_2.$$

Dabei ist \(\Delta(q)=\sum_{m\ge 1}\tau(m)q^m\) die Diskriminantenform. Für positive Koeffizienten gilt

$$[q^M]E_2=-24\sigma_1(M),\qquad [q^M]E_4=240\sigma_3(M),\qquad [q^M]E_6=-504\sigma_5(M),$$

$$[q^M]E_8=480\sigma_7(M),\qquad [q^M]E_{10}=-264\sigma_9(M),\qquad [q^M]E_{12}=\frac{65520}{691}\sigma_{11}(M),$$

sowie

$$[q^M]\Delta=\tau(M).$$

Somit wird jeder benötigte Koeffizient von \((1-E_2)^6\) zu einer Linearkombination aus \(M^r\sigma_{2k-1}(M)\) und \(\tau(M)\).

Schritt 5: Die arithmetischen Daten bei \(M=10000!\) auswerten

Setze \(N=10000\). Für jedes Prim \(p\le N\) liefert die Formel von Legendre

$$v_p(N!)=\sum_{t\ge 1}\left\lfloor\frac{N}{p^t}\right\rfloor.$$

Also

$$10000!=\prod_{p\le 10000}p^{v_p(10000!)}.$$

Für ungerades \(r\in\{1,3,5,7,9,11\}\) folgt aus der Multiplikativität

$$\sigma_r(10000!)=\prod_{p\le 10000}\left(1+p^r+\cdots+p^{r\,v_p(10000!)}\right)=\prod_{p\le 10000}\frac{p^{r(v_p(10000!)+1)}-1}{p^r-1}.$$

Auch die Ramanujan-Tau-Funktion ist multiplikativ:

$$\tau(10000!)=\prod_{p^e\parallel 10000!}\tau(p^e),$$

wobei für Primzahlpotenzen gilt

$$\tau(p^e)=\tau(p)\tau(p^{e-1})-p^{11}\tau(p^{e-2}).$$

Die Primwerte \(\tau(p)\) entstehen zunächst aus der Rekursion

$$\tau(1)=1,\qquad (n-1)\tau(n)=-24\sum_{k=1}^{n-1}\sigma_1(k)\tau(n-k)\qquad (n\ge 2).$$

Durchgerechnetes Beispiel: \(R_1(10)\) und \(R_2(3)\)

Für \(M=10\) lauten die Teilerpaare \((1,10)\), \((2,5)\), \((5,2)\) und \((10,1)\). Die Beiträge sind \(11\), \(7\), \(7\) und \(11\), also

$$R_1(10)=11+7+7+11=36=2(1+2+5+10).$$

Für \(n=2\) und \(M=3\) gibt es nur die Zerlegungen \(3=1+2\) und \(3=2+1\). Mit \(R_1(1)=2\) und \(R_1(2)=6\) ergibt sich

$$R_2(3)=R_1(1)R_1(2)+R_1(2)R_1(1)=2\cdot 6+6\cdot 2=24.$$

Dieses kleine Beispiel zeigt exakt die Faltungsstruktur, die später durch Potenzen der erzeugenden Funktion erfasst wird.

Wie der Code arbeitet

Die C++-, Python- und Java-Implementierungen folgen demselben Ablauf. Zuerst werden alle Primzahlen bis \(10000\) gesiebt und die Exponenten \(v_p(10000!)\) bestimmt. Daraus werden die sechs benötigten Divisorsummen \(\sigma_1,\sigma_3,\sigma_5,\sigma_7,\sigma_9,\sigma_{11}\) multiplicativ modulo \(10^9+7\) berechnet. Zusätzlich wird \(10000!\bmod(10^9+7)\) bestimmt, damit die Faktoren \(M,M^2,\dots,M^5\) aus den Ableitungen verfügbar sind.

Danach erzeugt die Implementierung alle Werte \(\sigma_1(n)\) für \(1\le n\le 10000\), berechnet daraus die Folge \(\tau(n)\) bis \(10000\) und erweitert anschließend von den Primwerten zu den Primzahlpotenzen \(\tau(p^e)\). Für diese zweite Stufe wird die lineare Rekursion mit einer \(2\times 2\)-Matrixpotenz ausgewertet.

Im letzten Schritt werden die Divisorsummen, der \(\tau\)-Term und die Potenzen von \(10000!\) in die Gewicht-12-Zerlegung von \((1-E_2)^6\) eingesetzt. Die Division durch \(12^6=2985984\) erfolgt modulo \(10^9+7\) über das multiplikative Inverse.

Komplexitätsanalyse

Für \(N=10000\) benötigen Primzahlsieb und Faktoriellbewertungen \(O(N\log\log N)\) Zeit. Die Tabelle \(\sigma_1(n)\) per Teilersummenverfahren kostet \(O(N\log N)\). Die Rekursion für \(\tau(n)\) ist quadratisch, also \(O(N^2)\), und dominiert damit die tatsächliche Laufzeit. Die verbleibenden Primprodukte und Primzahlpotenz-Rekursionen liegen nur bei etwa \(O(\pi(N)\log N)\). Der Speicherbedarf ist \(O(N)\).

Fußnoten und Referenzen

  1. Problemseite: https://projecteuler.net/problem=851
  2. Teilerfunktion: Wikipedia - Divisor function
  3. Eisenstein-Reihen: Wikipedia - Eisensteinreihe
  4. Quasimodulare Form: Wikipedia - Quasimodular form
  5. Ramanujan-Tau-Funktion: Wikipedia - Ramanujan tau function
  6. Formel von Legendre: Wikipedia - Legendre's formula

Problem Özeti

\(E_n=(\mathbb{Z}_{>0})^n\) olsun. İki pozitif tamsayı vektörü \(u=(u_1,\dots,u_n)\) ve \(v=(v_1,\dots,v_n)\) için

$$\langle u,v\rangle=\sum_{i=1}^{n}u_iv_i,\qquad u\star v=\prod_{i=1}^{n}(u_i+v_i)$$

tanımlanır. \(R_n(M)\), \(\langle u,v\rangle=M\) şartını sağlayan tüm sıralı \((u,v)\in E_n\times E_n\) çiftleri üzerinde \(u\star v\) toplamıdır. İstenen değer

$$R_6(10000!) \pmod{10^9+7}$$

olduğundan doğrudan sayım mümkün değildir. Çözüm, önce problemi bir üreteç fonksiyon katsayısı bulma işine dönüştürür, sonra da bu fonksiyonu kuasimodüler form özdeşlikleriyle sadeleştirir.

Matematiksel Yaklaşım

Yöntemin özü şudur: tek bir koordinat basit bir bölen-toplamına indirgenir; ardından bu tek-boyutlu çekirdek altı kez evriştirilir; son olarak ortaya çıkan altıncı kuvvet, ağırlık 12 uzayında daha yönetilebilir bir tabana açılır.

Adım 1: Tek Koordinatı Bölen Toplamına İndirgeme

\(n=1\) için \(\langle u,v\rangle=M\) şartı yalnızca \(uv=M\) demektir. Her \(d\mid M\) böleni, \((d,M/d)\) sıralı çiftini verir ve katkı

$$d+\frac{M}{d}$$

olur. Dolayısıyla

$$R_1(M)=\sum_{d\mid M}\left(d+\frac{M}{d}\right)=2\sum_{d\mid M}d=2\sigma_1(M).$$

Adım 2: Altı Koordinatı Toplamsal Evrişime Dönüştürme

Genel durumda

$$m_i=u_iv_i\qquad (1\le i\le n)$$

yazalım. O zaman

$$m_1+\cdots+m_n=M$$

olur ve sabit bir ayrışım için koordinat katkıları çarpılır. Bu yüzden

$$R_n(M)=\sum_{\substack{m_1+\cdots+m_n=M\\m_i\ge 1}}R_1(m_1)\cdots R_1(m_n).$$

Şimdi

$$G(q)=\sum_{m\ge 1}R_1(m)q^m$$

tanımını yaparsak, bu tam olarak

$$R_n(M)=[q^M]\,G(q)^n$$

kimliğini verir.

Adım 3: Üreteç Fonksiyonu Eisenstein Serileriyle Yazma

Kuasimodüler seri \(E_2\) için

$$E_2(q)=1-24\sum_{m\ge 1}\sigma_1(m)q^m$$

olduğundan ve \(R_1(m)=2\sigma_1(m)\) eşitliği geçerli olduğundan

$$G(q)=2\sum_{m\ge 1}\sigma_1(m)q^m=\frac{1-E_2(q)}{12}.$$

Böylece hedef değer

$$R_6(M)=[q^M]\left(\frac{1-E_2(q)}{12}\right)^6$$

şeklini alır. \(M=10000!>0\) olduğu için sabit terim hiçbir katkı vermez; önemli olan yalnızca \(E_2\)'nin kuvvetlerinin pozitif dereceli katsayılarıdır.

Adım 4: \(E_2\) Kuvvetlerini Ağırlık 12'de İndirgeme

$$D=q\frac{d}{dq}$$

operatörünü kullanalım. Eğer \(f(q)=\sum_{m\ge 0}a_mq^m\) ise

$$[q^M]D^r f=M^r a_M$$

olur. Kullanılan standart indirgemeler şunlardır:

$$E_2^2=E_4+12DE_2,$$

$$E_2^3=E_6+9DE_4+72D^2E_2,$$

$$E_2^4=E_8+8DE_6+\frac{216}{5}D^2E_4+288D^3E_2,$$

$$E_2^5=E_{10}+\frac{15}{2}DE_8+\frac{240}{7}D^2E_6+144D^3E_4+864D^4E_2,$$

$$E_2^6=E_{12}-\frac{4608}{24185}\Delta+\frac{36}{5}DE_{10}+30D^2E_8+\frac{720}{7}D^3E_6+\frac{2592}{7}D^4E_4+\frac{10368}{5}D^5E_2.$$

Burada \(\Delta(q)=\sum_{m\ge 1}\tau(m)q^m\) diskriminant cusp formudur. Eisenstein serilerinin pozitif katsayıları

$$[q^M]E_2=-24\sigma_1(M),\qquad [q^M]E_4=240\sigma_3(M),\qquad [q^M]E_6=-504\sigma_5(M),$$

$$[q^M]E_8=480\sigma_7(M),\qquad [q^M]E_{10}=-264\sigma_9(M),\qquad [q^M]E_{12}=\frac{65520}{691}\sigma_{11}(M),$$

ve ayrıca

$$[q^M]\Delta=\tau(M)$$

şeklindedir. Sonuç olarak \((1-E_2)^6\)'nin ihtiyaç duyulan her katsayısı, \(M^r\sigma_{2k-1}(M)\) ve \(\tau(M)\) cinsinden yazılır.

Adım 5: \(M=10000!\) Noktasında Aritmetiği Hesaplama

\(N=10000\) olsun. Her \(p\le N\) asalı için Legendre formülü

$$v_p(N!)=\sum_{t\ge 1}\left\lfloor\frac{N}{p^t}\right\rfloor$$

değerini verir. Böylece

$$10000!=\prod_{p\le 10000}p^{v_p(10000!)}.$$

Tek kuvvetli bölen toplamları için çarpımsal formül

$$\sigma_r(10000!)=\prod_{p\le 10000}\left(1+p^r+\cdots+p^{r\,v_p(10000!)}\right)=\prod_{p\le 10000}\frac{p^{r(v_p(10000!)+1)}-1}{p^r-1}$$

şeklindedir; burada \(r\in\{1,3,5,7,9,11\}\).

Ramanujan \(\tau\) fonksiyonu da çarpımsaldır:

$$\tau(10000!)=\prod_{p^e\parallel 10000!}\tau(p^e),$$

ve asal kuvvet bağıntısı

$$\tau(p^e)=\tau(p)\tau(p^{e-1})-p^{11}\tau(p^{e-2})$$

olarak kullanılır. Asal değerler için önce

$$\tau(1)=1,\qquad (n-1)\tau(n)=-24\sum_{k=1}^{n-1}\sigma_1(k)\tau(n-k)\qquad (n\ge 2)$$

reküransı ile \(\tau(n)\) dizisi kurulup, daha sonra gerekli asal kuvvetlere yükseltilir.

Çalışılmış Örnek: \(R_1(10)\) ve \(R_2(3)\)

\(M=10\) için bölen çiftleri \((1,10)\), \((2,5)\), \((5,2)\) ve \((10,1)\)'dir. Katkılar sırasıyla \(11\), \(7\), \(7\) ve \(11\) olur. Dolayısıyla

$$R_1(10)=11+7+7+11=36=2(1+2+5+10).$$

Şimdi \(n=2\), \(M=3\) için yalnızca \(3=1+2\) ve \(3=2+1\) ayrışımları vardır. \(R_1(1)=2\) ve \(R_1(2)=6\) olduğundan

$$R_2(3)=R_1(1)R_1(2)+R_1(2)R_1(1)=2\cdot 6+6\cdot 2=24.$$

Bu küçük örnek, neden üreteç fonksiyon kuvvetlerinin doğru araç olduğunu açıkça gösterir.

Kod Nasıl Çalışıyor

C++, Python ve Java uygulamaları aynı mantıksal sırayı izler. Önce \(10000\)'e kadar asallar elenir ve her asal için \(v_p(10000!)\) bulunur. Bu üsler üzerinden \(\sigma_1,\sigma_3,\sigma_5,\sigma_7,\sigma_9,\sigma_{11}\) değerleri mod \(10^9+7\) altında çarpımsal olarak hesaplanır. Aynı aşamada \(10000! \bmod (10^9+7)\) elde edilerek türevlerden gelecek \(M,M^2,\dots,M^5\) çarpanları hazırlanır.

Ardından uygulama \(1\le n\le 10000\) için \(\sigma_1(n)\) tablosunu üretir, bu tabloyu kullanarak \(\tau(n)\) dizisini \(10000\)'e kadar hesaplar ve sonra asal değerlerden asal kuvvet değerlerine geçer. İkinci dereceden bu lineer rekürans, her asal kuvvet için \(2\times 2\) matris üs alma yöntemiyle hızlandırılır.

Son aşamada tüm bölen toplamları, \(\tau\) katkısı ve \(10000!\)'in kuvvetleri, \((1-E_2)^6\)'nin ağırlık 12 ayrışımındaki katsayılara yerleştirilir. En sonda \(12^6=2985984\) ile bölme işlemi, modüler tersle çarpma olarak yapılır.

Karmaşıklık Analizi

\(N=10000\) için asal eleği ve faktöriyel üsleri \(O(N\log\log N)\) zamanda bulunur. Bölen-toplam tablosu \(O(N\log N)\) maliyetlidir. \(\tau(n)\) reküransı ise \(O(N^2)\) zamanda çalışır ve gerçek koşuda baskın adımdır. Geriye kalan asal çarpımları ve asal kuvvet işlemleri yaklaşık \(O(\pi(N)\log N)\) düzeyindedir. Bellek kullanımı \(O(N)\)'dir.

Dipnotlar ve Kaynaklar

  1. Problem sayfası: https://projecteuler.net/problem=851
  2. Bölen fonksiyonu: Wikipedia - Divisor function
  3. Eisenstein serileri: Wikipedia - Eisenstein series
  4. Kuasimodüler form: Wikipedia - Quasimodular form
  5. Ramanujan \(\tau\) fonksiyonu: Wikipedia - Ramanujan tau function
  6. Legendre formülü: Wikipedia - Legendre's formula

Resumen del Problema

Sea \(E_n=(\mathbb{Z}_{>0})^n\). Para dos vectores de enteros positivos \(u=(u_1,\dots,u_n)\) y \(v=(v_1,\dots,v_n)\), se define

$$\langle u,v\rangle=\sum_{i=1}^{n}u_iv_i,\qquad u\star v=\prod_{i=1}^{n}(u_i+v_i).$$

\(R_n(M)\) es la suma de \(u\star v\) sobre todos los pares ordenados \((u,v)\in E_n\times E_n\) tales que \(\langle u,v\rangle=M\). El objetivo es calcular

$$R_6(10000!) \pmod{10^9+7}.$$

Una enumeración directa es inviable. Por eso la solución transforma el problema en una extracción de coeficientes de una serie generadora y luego reduce esa serie con identidades de formas cuasimodulares.

Enfoque Matemático

La estructura es la siguiente: primero se resuelve una coordenada, luego se usa la independencia entre coordenadas para obtener una convolución aditiva, y finalmente se reescribe la sexta potencia resultante en una base de peso 12.

Paso 1: Reducir una Coordenada a una Suma sobre Divisores

Cuando \(n=1\), la condición \(\langle u,v\rangle=M\) es simplemente \(uv=M\). Cada divisor \(d\mid M\) produce el par ordenado \((d,M/d)\), con contribución

$$d+\frac{M}{d}.$$

Por tanto,

$$R_1(M)=\sum_{d\mid M}\left(d+\frac{M}{d}\right)=2\sum_{d\mid M}d=2\sigma_1(M).$$

Paso 2: Convertir Seis Coordenadas en una Convolución Aditiva

Para un par general definimos

$$m_i=u_iv_i\qquad (1\le i\le n).$$

Entonces

$$m_1+\cdots+m_n=M,$$

y para una descomposición fija de \(M\) las contribuciones se multiplican coordenada por coordenada. Así

$$R_n(M)=\sum_{\substack{m_1+\cdots+m_n=M\\m_i\ge 1}}R_1(m_1)\cdots R_1(m_n).$$

Si escribimos

$$G(q)=\sum_{m\ge 1}R_1(m)q^m,$$

entonces

$$R_n(M)=[q^M]\,G(q)^n.$$

Paso 3: Expresar la Serie Generadora con la Serie de Eisenstein \(E_2\)

La serie cuasimodular \(E_2\) satisface

$$E_2(q)=1-24\sum_{m\ge 1}\sigma_1(m)q^m.$$

Como \(R_1(m)=2\sigma_1(m)\), se obtiene

$$G(q)=2\sum_{m\ge 1}\sigma_1(m)q^m=\frac{1-E_2(q)}{12}.$$

Por consiguiente,

$$R_6(M)=[q^M]\left(\frac{1-E_2(q)}{12}\right)^6.$$

Dado que \(M=10000!>0\), el término constante no interviene; lo que importa es extraer coeficientes positivos de las potencias de \(E_2\).

Paso 4: Reducir las Potencias de \(E_2\) en Peso 12

Sea

$$D=q\frac{d}{dq}.$$

Si \(f(q)=\sum_{m\ge 0}a_mq^m\), entonces

$$[q^M]D^r f=M^r a_M.$$

Las identidades usadas son

$$E_2^2=E_4+12DE_2,$$

$$E_2^3=E_6+9DE_4+72D^2E_2,$$

$$E_2^4=E_8+8DE_6+\frac{216}{5}D^2E_4+288D^3E_2,$$

$$E_2^5=E_{10}+\frac{15}{2}DE_8+\frac{240}{7}D^2E_6+144D^3E_4+864D^4E_2,$$

$$E_2^6=E_{12}-\frac{4608}{24185}\Delta+\frac{36}{5}DE_{10}+30D^2E_8+\frac{720}{7}D^3E_6+\frac{2592}{7}D^4E_4+\frac{10368}{5}D^5E_2.$$

Aquí \(\Delta(q)=\sum_{m\ge 1}\tau(m)q^m\) es la forma cuspídea discriminante. Los coeficientes positivos de las series de Eisenstein son

$$[q^M]E_2=-24\sigma_1(M),\qquad [q^M]E_4=240\sigma_3(M),\qquad [q^M]E_6=-504\sigma_5(M),$$

$$[q^M]E_8=480\sigma_7(M),\qquad [q^M]E_{10}=-264\sigma_9(M),\qquad [q^M]E_{12}=\frac{65520}{691}\sigma_{11}(M),$$

mientras que

$$[q^M]\Delta=\tau(M).$$

Así, cada coeficiente necesario de \((1-E_2)^6\) queda escrito como combinación lineal de \(M^r\sigma_{2k-1}(M)\) y de \(\tau(M)\).

Paso 5: Evaluar los Datos Aritméticos en \(M=10000!\)

Tomemos \(N=10000\). Para cada primo \(p\le N\), la fórmula de Legendre da

$$v_p(N!)=\sum_{t\ge 1}\left\lfloor\frac{N}{p^t}\right\rfloor.$$

Luego

$$10000!=\prod_{p\le 10000}p^{v_p(10000!)}.$$

Para \(r\in\{1,3,5,7,9,11\}\), la multiplicatividad produce

$$\sigma_r(10000!)=\prod_{p\le 10000}\left(1+p^r+\cdots+p^{r\,v_p(10000!)}\right)=\prod_{p\le 10000}\frac{p^{r(v_p(10000!)+1)}-1}{p^r-1}.$$

La función tau de Ramanujan también es multiplicativa:

$$\tau(10000!)=\prod_{p^e\parallel 10000!}\tau(p^e),$$

con la recurrencia

$$\tau(p^e)=\tau(p)\tau(p^{e-1})-p^{11}\tau(p^{e-2}).$$

Para obtener los valores primos \(\tau(p)\), primero se calcula \(\tau(n)\) hasta \(10000\) mediante

$$\tau(1)=1,\qquad (n-1)\tau(n)=-24\sum_{k=1}^{n-1}\sigma_1(k)\tau(n-k)\qquad (n\ge 2).$$

Ejemplo Trabajado: \(R_1(10)\) y \(R_2(3)\)

Para \(M=10\), los pares son \((1,10)\), \((2,5)\), \((5,2)\) y \((10,1)\). Sus contribuciones son \(11\), \(7\), \(7\) y \(11\), así que

$$R_1(10)=11+7+7+11=36=2(1+2+5+10).$$

Ahora, para \(n=2\) y \(M=3\), las únicas descomposiciones positivas son \(3=1+2\) y \(3=2+1\). Como \(R_1(1)=2\) y \(R_1(2)=6\), se obtiene

$$R_2(3)=R_1(1)R_1(2)+R_1(2)R_1(1)=2\cdot 6+6\cdot 2=24.$$

Este ejemplo pequeño muestra con claridad la estructura de convolución que después se codifica mediante una potencia de series generadoras.

Cómo Funciona el Código

Las implementaciones en C++, Python y Java siguen la misma ruta algebraica. Primero generan los primos hasta \(10000\) y calculan cada exponente \(v_p(10000!)\). Con esos exponentes evalúan multiplicativamente \(\sigma_1,\sigma_3,\sigma_5,\sigma_7,\sigma_9,\sigma_{11}\) módulo \(10^9+7\), y también calculan \(10000!\bmod(10^9+7)\) para disponer de \(M,M^2,\dots,M^5\).

Después la implementación construye la tabla de \(\sigma_1(n)\) para \(1\le n\le 10000\), obtiene \(\tau(n)\) hasta \(10000\) con la recurrencia anterior y extiende esos valores a las potencias primas \(\tau(p^e)\). Esa extensión se acelera usando una potencia de matrices \(2\times 2\) asociada a la recurrencia lineal de segundo orden.

Por último, el programa sustituye las sumas de divisores, el término \(\tau\) y las potencias de \(10000!\) en la descomposición de peso 12 de \((1-E_2)^6\). La división final por \(12^6=2985984\) se hace multiplicando por el inverso modular.

Análisis de Complejidad

Con \(N=10000\), la criba y las valuaciones del factorial cuestan \(O(N\log\log N)\). La tabla de \(\sigma_1(n)\) cuesta \(O(N\log N)\). La recurrencia para \(\tau(n)\) es \(O(N^2)\) y domina el tiempo total de ejecución. Los productos sobre primos y las recurrencias en potencias primas son de orden menor, aproximadamente \(O(\pi(N)\log N)\). La memoria utilizada es \(O(N)\).

Notas y Referencias

  1. Página del problema: https://projecteuler.net/problem=851
  2. Función divisor: Wikipedia - Divisor function
  3. Series de Eisenstein: Wikipedia - Eisenstein series
  4. Forma cuasimodular: Wikipedia - Quasimodular form
  5. Función tau de Ramanujan: Wikipedia - Ramanujan tau function
  6. Fórmula de Legendre: Wikipedia - Legendre's formula

问题概述

设 \(E_n=(\mathbb{Z}_{>0})^n\)。对两个正整数向量 \(u=(u_1,\dots,u_n)\) 与 \(v=(v_1,\dots,v_n)\),定义

$$\langle u,v\rangle=\sum_{i=1}^{n}u_iv_i,\qquad u\star v=\prod_{i=1}^{n}(u_i+v_i).$$

\(R_n(M)\) 表示所有满足 \(\langle u,v\rangle=M\) 的有序向量对 \((u,v)\in E_n\times E_n\) 上,\(u\star v\) 的总和。目标是求

$$R_6(10000!) \pmod{10^9+7}.$$

如果直接枚举六维向量对,规模完全不可接受。因此解法先把问题改写成一个生成函数的系数提取问题,再用权 12 的拟模形式恒等式把这个系数表达成若干经典算术函数的组合。

数学方法

整个推导可以分成三个层次。第一层把单个坐标的贡献写成约数和;第二层利用各坐标的独立性把 \(R_6(M)\) 变成一个六重加法卷积;第三层用 Eisenstein 级数、导数算子和 Ramanujan \(\tau\) 函数,把这个卷积对应的生成函数化到可直接计算的形式。

步骤 1:先看一维情形

当 \(n=1\) 时,条件 \(\langle u,v\rangle=M\) 就是 \(uv=M\)。如果 \(d\mid M\),那么就有一个有序对 \((d,M/d)\),它对 \(u\star v\) 的贡献为

$$d+\frac{M}{d}.$$

于是

$$R_1(M)=\sum_{d\mid M}\left(d+\frac{M}{d}\right)=2\sum_{d\mid M}d=2\sigma_1(M).$$

这一步非常关键,因为它告诉我们:原问题里每个坐标的本质贡献,实际上就是一个标准的约数函数。

步骤 2:把多维求和写成加法卷积

对一般的 \(n\),记

$$m_i=u_iv_i\qquad (1\le i\le n).$$

那么内积条件变成

$$m_1+\cdots+m_n=M.$$

而乘积权重 \(u\star v=\prod_{i=1}^{n}(u_i+v_i)\) 会按坐标拆开,因此对于一个固定的分拆 \(M=m_1+\cdots+m_n\),总贡献恰好是

$$R_1(m_1)\cdots R_1(m_n).$$

所以

$$R_n(M)=\sum_{\substack{m_1+\cdots+m_n=M\\m_i\ge 1}}R_1(m_1)\cdots R_1(m_n).$$

如果定义生成函数

$$G(q)=\sum_{m\ge 1}R_1(m)q^m,$$

那么上式正是

$$R_n(M)=[q^M]\,G(q)^n.$$

也就是说,原来的组合求和被完全转化成了一个系数提取问题。

步骤 3:把生成函数写成 \(E_2\)

拟模 Eisenstein 级数 \(E_2\) 满足

$$E_2(q)=1-24\sum_{m\ge 1}\sigma_1(m)q^m.$$

而前面已经知道 \(R_1(m)=2\sigma_1(m)\),因此

$$G(q)=2\sum_{m\ge 1}\sigma_1(m)q^m=\frac{1-E_2(q)}{12}.$$

于是目标值变成

$$R_6(M)=[q^M]\left(\frac{1-E_2(q)}{12}\right)^6.$$

由于目标 \(M=10000!\) 是正数,常数项只会影响 \(q^0\) 的系数,因此这里完全可以忽略,只需关注 \(E_2\) 各次幂的正次项系数。

步骤 4:在权 12 中化简 \(E_2\) 的幂

记微分算子

$$D=q\frac{d}{dq}.$$

若 \(f(q)=\sum_{m\ge 0}a_mq^m\),则

$$[q^M]D^r f=M^r a_M.$$

实现中使用的标准化简公式为

$$E_2^2=E_4+12DE_2,$$

$$E_2^3=E_6+9DE_4+72D^2E_2,$$

$$E_2^4=E_8+8DE_6+\frac{216}{5}D^2E_4+288D^3E_2,$$

$$E_2^5=E_{10}+\frac{15}{2}DE_8+\frac{240}{7}D^2E_6+144D^3E_4+864D^4E_2,$$

$$E_2^6=E_{12}-\frac{4608}{24185}\Delta+\frac{36}{5}DE_{10}+30D^2E_8+\frac{720}{7}D^3E_6+\frac{2592}{7}D^4E_4+\frac{10368}{5}D^5E_2.$$

这里 \(\Delta(q)=\sum_{m\ge 1}\tau(m)q^m\) 是判别式 cusp form。Eisenstein 级数的正次项系数为

$$[q^M]E_2=-24\sigma_1(M),\qquad [q^M]E_4=240\sigma_3(M),\qquad [q^M]E_6=-504\sigma_5(M),$$

$$[q^M]E_8=480\sigma_7(M),\qquad [q^M]E_{10}=-264\sigma_9(M),\qquad [q^M]E_{12}=\frac{65520}{691}\sigma_{11}(M),$$

同时

$$[q^M]\Delta=\tau(M).$$

因此,\((1-E_2)^6\) 的每一个所需系数都可以改写成 \(M^r\sigma_{2k-1}(M)\) 和 \(\tau(M)\) 的线性组合。这正是程序最终代入计算的核心公式。

步骤 5:在 \(M=10000!\) 处计算这些算术量

令 \(N=10000\)。对每个素数 \(p\le N\),由 Legendre 公式可得

$$v_p(N!)=\sum_{t\ge 1}\left\lfloor\frac{N}{p^t}\right\rfloor.$$

于是

$$10000!=\prod_{p\le 10000}p^{v_p(10000!)}.$$

对所有需要的奇数 \(r\in\{1,3,5,7,9,11\}\),有

$$\sigma_r(10000!)=\prod_{p\le 10000}\left(1+p^r+\cdots+p^{r\,v_p(10000!)}\right)=\prod_{p\le 10000}\frac{p^{r(v_p(10000!)+1)}-1}{p^r-1}.$$

Ramanujan \(\tau\) 函数同样具有乘法性,因此

$$\tau(10000!)=\prod_{p^e\parallel 10000!}\tau(p^e).$$

对素数幂,使用递推

$$\tau(p^e)=\tau(p)\tau(p^{e-1})-p^{11}\tau(p^{e-2}).$$

为了先得到各个素数上的 \(\tau(p)\),实现会先按下面的递推把 \(\tau(n)\) 算到 \(10000\):

$$\tau(1)=1,\qquad (n-1)\tau(n)=-24\sum_{k=1}^{n-1}\sigma_1(k)\tau(n-k)\qquad (n\ge 2).$$

例子:\(R_1(10)\) 与 \(R_2(3)\)

先看 \(M=10\)。有序约数对是 \((1,10)\)、\((2,5)\)、\((5,2)\)、\((10,1)\),对应贡献分别为 \(11\)、\(7\)、\(7\)、\(11\)。所以

$$R_1(10)=11+7+7+11=36=2(1+2+5+10).$$

再看 \(n=2\)、\(M=3\)。正整数分拆只有 \(3=1+2\) 与 \(3=2+1\)。因为 \(R_1(1)=2\),\(R_1(2)=2(1+2)=6\),所以

$$R_2(3)=R_1(1)R_1(2)+R_1(2)R_1(1)=2\cdot 6+6\cdot 2=24.$$

这个小例子已经完整展示了“单坐标核函数 + 多坐标卷积”的思路,而六维情形只是再加上一层拟模形式化简。

代码如何工作

C++、Python 和 Java 三个实现遵循同一条数学管线。首先筛出不超过 \(10000\) 的所有素数,并计算每个素数在 \(10000!\) 中的指数 \(v_p(10000!)\)。利用这些指数,可以乘法式地求出 \(\sigma_1,\sigma_3,\sigma_5,\sigma_7,\sigma_9,\sigma_{11}\) 在模 \(10^9+7\) 下的值。同时还会计算 \(10000!\bmod(10^9+7)\),从而得到导数项所需要的 \(M,M^2,\dots,M^5\)。

接着,实现构造 \(1\le n\le 10000\) 的 \(\sigma_1(n)\) 表,并据此递推出 \(\tau(n)\) 到 \(10000\)。拿到素数上的 \(\tau(p)\) 以后,再通过素数幂递推求 \(\tau(p^e)\)。这个二阶线性递推用一个 \(2\times 2\) 矩阵快速幂来加速,因此对每个素数幂都可以高效求值。

最后,程序把所有约数和、\(\tau\) 项以及 \(10000!\) 的幂代入 \((1-E_2)^6\) 的权 12 展开式中。由于要除以 \(12^6=2985984\),实现会在模 \(10^9+7\) 下乘上这个数的逆元,得到最终答案。

复杂度分析

记 \(N=10000\)。筛法和阶乘素因子指数的计算是 \(O(N\log\log N)\)。利用约数枚举方式构造 \(\sigma_1(n)\) 表需要 \(O(N\log N)\)。而 \(\tau(n)\) 的递推是双重循环,因此是 \(O(N^2)\),这也是实际实现中的主导时间开销。后面的素数乘积和素数幂递推只占较低阶,大约为 \(O(\pi(N)\log N)\)。空间复杂度为 \(O(N)\)。

脚注与参考资料

  1. 题目页面:https://projecteuler.net/problem=851
  2. 约数函数:Wikipedia - Divisor function
  3. Eisenstein 级数:Wikipedia - Eisenstein series
  4. 拟模形式:Wikipedia - Quasimodular form
  5. Ramanujan \(\tau\) 函数:Wikipedia - Ramanujan tau function
  6. Legendre 公式:Wikipedia - Legendre's formula

Краткое описание задачи

Пусть \(E_n=(\mathbb{Z}_{>0})^n\). Для двух векторов положительных целых чисел \(u=(u_1,\dots,u_n)\) и \(v=(v_1,\dots,v_n)\) заданы

$$\langle u,v\rangle=\sum_{i=1}^{n}u_iv_i,\qquad u\star v=\prod_{i=1}^{n}(u_i+v_i).$$

Величина \(R_n(M)\) равна сумме \(u\star v\) по всем упорядоченным парам \((u,v)\in E_n\times E_n\), для которых \(\langle u,v\rangle=M\). Нужно найти

$$R_6(10000!) \pmod{10^9+7}.$$

Перебирать шестимерные векторы напрямую невозможно. Поэтому решение переводит задачу к извлечению коэффициента из производящей функции, а затем упрощает эту функцию с помощью тождеств для квазимодулярных форм.

Математический подход

Ключевая идея состоит в том, что вклад каждой координаты сначала сводится к обычной функции делителей, после чего вся задача становится шестикратной аддитивной сверткой. Затем эта свертка переписывается через \(E_2\), а степени \(E_2\) раскладываются в базисе веса 12.

Шаг 1: Одномерный случай сводится к сумме по делителям

При \(n=1\) условие \(\langle u,v\rangle=M\) означает просто \(uv=M\). Каждый делитель \(d\mid M\) задает упорядоченную пару \((d,M/d)\), чей вклад равен

$$d+\frac{M}{d}.$$

Следовательно,

$$R_1(M)=\sum_{d\mid M}\left(d+\frac{M}{d}\right)=2\sum_{d\mid M}d=2\sigma_1(M).$$

Шаг 2: Многомерный случай есть аддитивная свертка

Для общего \(n\) положим

$$m_i=u_iv_i\qquad (1\le i\le n).$$

Тогда

$$m_1+\cdots+m_n=M,$$

а вес \(u\star v\) раскладывается по координатам. Поэтому для фиксированного разбиения \(M=m_1+\cdots+m_n\) полный вклад равен

$$R_1(m_1)\cdots R_1(m_n).$$

Итак,

$$R_n(M)=\sum_{\substack{m_1+\cdots+m_n=M\\m_i\ge 1}}R_1(m_1)\cdots R_1(m_n).$$

Если обозначить

$$G(q)=\sum_{m\ge 1}R_1(m)q^m,$$

то получаем точную формулу

$$R_n(M)=[q^M]\,G(q)^n.$$

Шаг 3: Выразим \(G(q)\) через \(E_2\)

Квазимодулярный ряд \(E_2\) имеет вид

$$E_2(q)=1-24\sum_{m\ge 1}\sigma_1(m)q^m.$$

Так как \(R_1(m)=2\sigma_1(m)\), отсюда сразу следует

$$G(q)=2\sum_{m\ge 1}\sigma_1(m)q^m=\frac{1-E_2(q)}{12}.$$

Значит,

$$R_6(M)=[q^M]\left(\frac{1-E_2(q)}{12}\right)^6.$$

Поскольку \(M=10000!>0\), постоянный член не влияет на искомый коэффициент. Остается разобрать только положительные коэффициенты степеней \(E_2\).

Шаг 4: Разложение степеней \(E_2\) в весе 12

Обозначим

$$D=q\frac{d}{dq}.$$

Если \(f(q)=\sum_{m\ge 0}a_mq^m\), то

$$[q^M]D^r f=M^r a_M.$$

Используются следующие тождества:

$$E_2^2=E_4+12DE_2,$$

$$E_2^3=E_6+9DE_4+72D^2E_2,$$

$$E_2^4=E_8+8DE_6+\frac{216}{5}D^2E_4+288D^3E_2,$$

$$E_2^5=E_{10}+\frac{15}{2}DE_8+\frac{240}{7}D^2E_6+144D^3E_4+864D^4E_2,$$

$$E_2^6=E_{12}-\frac{4608}{24185}\Delta+\frac{36}{5}DE_{10}+30D^2E_8+\frac{720}{7}D^3E_6+\frac{2592}{7}D^4E_4+\frac{10368}{5}D^5E_2.$$

Здесь \(\Delta(q)=\sum_{m\ge 1}\tau(m)q^m\) — дискриминантная cusp-форма. Положительные коэффициенты рядов Эйзенштейна равны

$$[q^M]E_2=-24\sigma_1(M),\qquad [q^M]E_4=240\sigma_3(M),\qquad [q^M]E_6=-504\sigma_5(M),$$

$$[q^M]E_8=480\sigma_7(M),\qquad [q^M]E_{10}=-264\sigma_9(M),\qquad [q^M]E_{12}=\frac{65520}{691}\sigma_{11}(M),$$

а также

$$[q^M]\Delta=\tau(M).$$

Тем самым каждый нужный коэффициент из \((1-E_2)^6\) записывается как линейная комбинация величин \(M^r\sigma_{2k-1}(M)\) и \(\tau(M)\).

Шаг 5: Вычисление при \(M=10000!\)

Положим \(N=10000\). Для любого простого \(p\le N\) формула Лежандра дает

$$v_p(N!)=\sum_{t\ge 1}\left\lfloor\frac{N}{p^t}\right\rfloor.$$

Следовательно,

$$10000!=\prod_{p\le 10000}p^{v_p(10000!)}.$$

Для каждого нечетного \(r\in\{1,3,5,7,9,11\}\) получаем

$$\sigma_r(10000!)=\prod_{p\le 10000}\left(1+p^r+\cdots+p^{r\,v_p(10000!)}\right)=\prod_{p\le 10000}\frac{p^{r(v_p(10000!)+1)}-1}{p^r-1}.$$

Функция Рамануджана \(\tau\) тоже мультипликативна:

$$\tau(10000!)=\prod_{p^e\parallel 10000!}\tau(p^e),$$

где для степеней простого используется рекурсия

$$\tau(p^e)=\tau(p)\tau(p^{e-1})-p^{11}\tau(p^{e-2}).$$

Чтобы получить значения \(\tau(p)\), сначала вычисляется последовательность \(\tau(n)\) до \(10000\) по формуле

$$\tau(1)=1,\qquad (n-1)\tau(n)=-24\sum_{k=1}^{n-1}\sigma_1(k)\tau(n-k)\qquad (n\ge 2).$$

Разобранный пример: \(R_1(10)\) и \(R_2(3)\)

Для \(M=10\) упорядоченные пары равны \((1,10)\), \((2,5)\), \((5,2)\), \((10,1)\). Их вклады — \(11\), \(7\), \(7\), \(11\). Поэтому

$$R_1(10)=11+7+7+11=36=2(1+2+5+10).$$

Для \(n=2\) и \(M=3\) существуют только разложения \(3=1+2\) и \(3=2+1\). Поскольку \(R_1(1)=2\) и \(R_1(2)=6\), имеем

$$R_2(3)=R_1(1)R_1(2)+R_1(2)R_1(1)=2\cdot 6+6\cdot 2=24.$$

На этом маленьком примере уже виден весь механизм: одномерное ядро, затем свертка, а в большой задаче поверх этого еще и квазимодулярное упрощение.

Как работает код

Реализации на C++, Python и Java следуют одной и той же схеме. Сначала они строят список простых чисел до \(10000\) и вычисляют все показатели \(v_p(10000!)\). По этим показателям мультипликативно находятся значения \(\sigma_1,\sigma_3,\sigma_5,\sigma_7,\sigma_9,\sigma_{11}\) по модулю \(10^9+7\). Параллельно вычисляется и \(10000!\bmod(10^9+7)\), чтобы иметь степени \(M,M^2,\dots,M^5\), возникающие из операторов \(D^r\).

Затем реализация строит таблицу \(\sigma_1(n)\) для \(1\le n\le 10000\), по рекуррентной формуле получает \(\tau(n)\) до \(10000\), а после этого поднимает значения с простых до степеней простых \(\tau(p^e)\). Для ускорения второй части используется быстрое возведение в степень матрицы \(2\times 2\), соответствующей линейной рекурсии второго порядка.

В конце все найденные суммы делителей, значение \(\tau(10000!)\) и степени \(10000!\) подставляются в разложение \((1-E_2)^6\) в весе 12. Деление на \(12^6=2985984\) выполняется по модулю \(10^9+7\) умножением на обратный элемент.

Анализ сложности

Пусть \(N=10000\). Решето и вычисление показателей факториала занимают \(O(N\log\log N)\) времени. Построение таблицы \(\sigma_1(n)\) стоит \(O(N\log N)\). Рекурсия для \(\tau(n)\) имеет квадратичную сложность \(O(N^2)\) и именно она доминирует в реальном времени работы. Остальные операции — произведения по простым и переход к степеням простых — имеют меньший порядок, примерно \(O(\pi(N)\log N)\). Память — \(O(N)\).

Сноски и ссылки

  1. Страница задачи: https://projecteuler.net/problem=851
  2. Функция делителей: Wikipedia - Divisor function
  3. Ряды Эйзенштейна: Wikipedia - Eisenstein series
  4. Квазимодулярные формы: Wikipedia - Quasimodular form
  5. Функция \(\tau\) Рамануджана: Wikipedia - Ramanujan tau function
  6. Формула Лежандра: Wikipedia - Legendre's formula

ملخص المسألة

لتكن \(E_n=(\mathbb{Z}_{>0})^n\). وللمتجهين ذوي المركبات الصحيحة الموجبة \(u=(u_1,\dots,u_n)\) و\(v=(v_1,\dots,v_n)\) نعرّف

$$\langle u,v\rangle=\sum_{i=1}^{n}u_iv_i,\qquad u\star v=\prod_{i=1}^{n}(u_i+v_i).$$

الكمية \(R_n(M)\) هي مجموع \(u\star v\) على جميع الأزواج المرتبة \((u,v)\in E_n\times E_n\) التي تحقق \(\langle u,v\rangle=M\). والمطلوب هو حساب

$$R_6(10000!) \pmod{10^9+7}.$$

العد المباشر للأزواج في ستة أبعاد غير عملي تماما، لذلك يحوّل الحل المسألة إلى استخراج معامل من دالة مولدة، ثم يختزل هذه الدالة باستخدام متطابقات من نظرية الأشكال شبه المعيارية.

المنهج الرياضي

الفكرة الأساسية تسير على مراحل. في البداية نفهم مساهمة بعد واحد فقط. بعد ذلك نستغل استقلال الإحداثيات لنحصل على التفاف جمعي من الرتبة السادسة. ثم نعيد كتابة السلسلة الناتجة بدلالة \(E_2\) ومشتقات سلاسل Eisenstein ودالة رامانوجان \(\tau\).

الخطوة 1: اختزال البعد الواحد إلى مجموع على القواسم

عندما \(n=1\) يصبح الشرط \(\langle u,v\rangle=M\) مجرد \(uv=M\). وكل قاسم \(d\mid M\) يعطي الزوج المرتب \((d,M/d)\)، ومساهمته في \(u\star v\) هي

$$d+\frac{M}{d}.$$

ومن ثم

$$R_1(M)=\sum_{d\mid M}\left(d+\frac{M}{d}\right)=2\sum_{d\mid M}d=2\sigma_1(M).$$

الخطوة 2: تحويل الحالة متعددة الأبعاد إلى التفاف جمعي

في الحالة العامة نكتب

$$m_i=u_iv_i\qquad (1\le i\le n).$$

وعندئذ

$$m_1+\cdots+m_n=M,$$

كما أن الوزن \(u\star v\) ينفصل إلى حاصل ضرب مساهمات الإحداثيات. لذلك، إذا ثبت التفكيك \(M=m_1+\cdots+m_n\)، كان المجموع المرتبط به هو

$$R_1(m_1)\cdots R_1(m_n).$$

وهكذا نحصل على

$$R_n(M)=\sum_{\substack{m_1+\cdots+m_n=M\\m_i\ge 1}}R_1(m_1)\cdots R_1(m_n).$$

ومع تعريف الدالة المولدة

$$G(q)=\sum_{m\ge 1}R_1(m)q^m,$$

تصبح الصيغة

$$R_n(M)=[q^M]\,G(q)^n.$$

الخطوة 3: كتابة السلسلة المولدة بدلالة \(E_2\)

السلسلة شبه المعيارية \(E_2\) تحقق

$$E_2(q)=1-24\sum_{m\ge 1}\sigma_1(m)q^m.$$

وبما أن \(R_1(m)=2\sigma_1(m)\)، نحصل مباشرة على

$$G(q)=2\sum_{m\ge 1}\sigma_1(m)q^m=\frac{1-E_2(q)}{12}.$$

ومن ثم

$$R_6(M)=[q^M]\left(\frac{1-E_2(q)}{12}\right)^6.$$

ولأن \(M=10000!>0\)، فإن الحد الثابت لا يسهم في المعامل المطلوب، وبالتالي يكفي تحليل معاملات القوى المختلفة لـ \(E_2\).

الخطوة 4: اختزال قوى \(E_2\) في الوزن 12

لنكتب

$$D=q\frac{d}{dq}.$$

إذا كانت \(f(q)=\sum_{m\ge 0}a_mq^m\)، فلدينا

$$[q^M]D^r f=M^r a_M.$$

المتطابقات المستعملة هي

$$E_2^2=E_4+12DE_2,$$

$$E_2^3=E_6+9DE_4+72D^2E_2,$$

$$E_2^4=E_8+8DE_6+\frac{216}{5}D^2E_4+288D^3E_2,$$

$$E_2^5=E_{10}+\frac{15}{2}DE_8+\frac{240}{7}D^2E_6+144D^3E_4+864D^4E_2,$$

$$E_2^6=E_{12}-\frac{4608}{24185}\Delta+\frac{36}{5}DE_{10}+30D^2E_8+\frac{720}{7}D^3E_6+\frac{2592}{7}D^4E_4+\frac{10368}{5}D^5E_2.$$

وهنا \(\Delta(q)=\sum_{m\ge 1}\tau(m)q^m\) هي الدالة التمييزية cusp form. أما معاملات سلاسل Eisenstein فهي

$$[q^M]E_2=-24\sigma_1(M),\qquad [q^M]E_4=240\sigma_3(M),\qquad [q^M]E_6=-504\sigma_5(M),$$

$$[q^M]E_8=480\sigma_7(M),\qquad [q^M]E_{10}=-264\sigma_9(M),\qquad [q^M]E_{12}=\frac{65520}{691}\sigma_{11}(M),$$

وكذلك

$$[q^M]\Delta=\tau(M).$$

وبهذا تتحول كل المعاملات المطلوبة في \((1-E_2)^6\) إلى تراكيب خطية من \(M^r\sigma_{2k-1}(M)\) ومن \(\tau(M)\).

الخطوة 5: تقييم الكميات الحسابية عند \(M=10000!\)

لنضع \(N=10000\). لكل عدد أولي \(p\le N\) تعطي صيغة Legendre

$$v_p(N!)=\sum_{t\ge 1}\left\lfloor\frac{N}{p^t}\right\rfloor.$$

ومن ثم

$$10000!=\prod_{p\le 10000}p^{v_p(10000!)}.$$

ولكل \(r\in\{1,3,5,7,9,11\}\) نحصل على

$$\sigma_r(10000!)=\prod_{p\le 10000}\left(1+p^r+\cdots+p^{r\,v_p(10000!)}\right)=\prod_{p\le 10000}\frac{p^{r(v_p(10000!)+1)}-1}{p^r-1}.$$

ودالة رامانوجان \(\tau\) ضربية أيضا، لذا

$$\tau(10000!)=\prod_{p^e\parallel 10000!}\tau(p^e),$$

مع علاقة القوى الأولية

$$\tau(p^e)=\tau(p)\tau(p^{e-1})-p^{11}\tau(p^{e-2}).$$

وللحصول على قيم \(\tau(p)\) نفسها، تبنى السلسلة \(\tau(n)\) حتى \(10000\) باستخدام

$$\tau(1)=1,\qquad (n-1)\tau(n)=-24\sum_{k=1}^{n-1}\sigma_1(k)\tau(n-k)\qquad (n\ge 2).$$

مثال محلول: \(R_1(10)\) و\(R_2(3)\)

عندما \(M=10\)، تكون الأزواج المرتبة هي \((1,10)\)، \((2,5)\)، \((5,2)\)، \((10,1)\). ومساهماتها هي \(11\)، \(7\)، \(7\)، \(11\). لذلك

$$R_1(10)=11+7+7+11=36=2(1+2+5+10).$$

والآن عند \(n=2\) و\(M=3\)، لا توجد إلا التجزئتان \(3=1+2\) و\(3=2+1\). وبما أن \(R_1(1)=2\) و\(R_1(2)=6\)، ينتج

$$R_2(3)=R_1(1)R_1(2)+R_1(2)R_1(1)=2\cdot 6+6\cdot 2=24.$$

هذا المثال الصغير يوضح بشكل كامل لماذا تتحول المسألة إلى قوة لدالة مولدة واحدة.

كيف يعمل الكود

تتبع تطبيقات C++ وPython وJava المسار الرياضي نفسه. في البداية تُستخرج جميع الأعداد الأولية حتى \(10000\)، ثم تُحسب القيم \(v_p(10000!)\) لكل أولي. ومن هذه القيم تُحسب كميات \(\sigma_1,\sigma_3,\sigma_5,\sigma_7,\sigma_9,\sigma_{11}\) بطريقة ضربية modulo \(10^9+7\). وفي الوقت نفسه يُحسب \(10000!\bmod(10^9+7)\) للحصول على القوى \(M,M^2,\dots,M^5\) اللازمة بعد تطبيق المشتقات.

بعد ذلك تبني التنفيذات جدولا لقيم \(\sigma_1(n)\) من \(1\) إلى \(10000\)، ثم تستخدم العلاقة السابقة لحساب \(\tau(n)\) حتى \(10000\). وبعد الحصول على القيم عند الأعداد الأولية، تُرفع هذه القيم إلى القوى الأولية \(\tau(p^e)\). ولتسريع هذه الخطوة، تُحوَّل العلاقة التراجعية من الرتبة الثانية إلى أسّ لمصفوفة \(2\times 2\).

في النهاية تُجمع حدود سلاسل القواسم مع حد \(\tau\) ومع قوى \(10000!\) داخل التوسيع من الوزن 12 لـ \((1-E_2)^6\). أما القسمة على \(12^6=2985984\)، فتتم في الحساب المعياري بواسطة الضرب في المعكوس الضربي.

تحليل التعقيد

إذا كان \(N=10000\)، فإن المصفاة وحساب أسس العوامل الأولية في \(N!\) يكلفان \(O(N\log\log N)\). وبناء جدول \(\sigma_1(n)\) يكلف \(O(N\log N)\). أما علاقة \(\tau(n)\) فهي تربيعية \(O(N^2)\)، وهي الخطوة المسيطرة فعليا في زمن التنفيذ. بقية الضربات على الأعداد الأولية وعلاقات القوى الأولية أصغر رتبة، وتقع تقريبا ضمن \(O(\pi(N)\log N)\). استهلاك الذاكرة هو \(O(N)\).

هوامش ومراجع

  1. صفحة المسألة: https://projecteuler.net/problem=851
  2. دالة القواسم: Wikipedia - Divisor function
  3. متسلسلات Eisenstein: Wikipedia - Eisenstein series
  4. الأشكال شبه المعيارية: Wikipedia - Quasimodular form
  5. دالة رامانوجان \(\tau\): Wikipedia - Ramanujan tau function
  6. صيغة Legendre: Wikipedia - Legendre's formula