Problem Summary

We seek the number of integers \(n \le N\), with \(N=9\times 10^{18}\), that can be written in the form

$$n=a^2b^3,\qquad a>1,\qquad b>1.$$

A direct scan up to \(N\) is impossible. The solution instead counts a larger class of numbers whose prime exponents are all at least \(2\), then removes the exceptional cases that still fail the conditions \(a>1\) and \(b>1\).

Mathematical Approach

Define

$$F(N)=\#\left\{n\le N : n=a^2b^3 \text{ for some } a,b>1\right\}.$$

If \(n=\prod p^{e_p}\) has the form \(a^2b^3\), then each exponent satisfies \(e_p\ge 2\). So every admissible \(n\) is a powerful number. The implementations therefore count all powerful numbers up to \(N\), and then subtract the powerful numbers that are still not valid \(a^2b^3\) values with both factors greater than \(1\).

Step 1: Count all powerful numbers through the canonical form

Every powerful number has a unique representation

$$n=u^2v^3,$$

where \(v\) is squarefree. For each prime exponent \(e\ge 2\), write

$$e=2\alpha+3\beta,\qquad \beta\in\{0,1\},$$

so the parity of \(e\) decides whether that prime contributes once to \(v\). This makes the decomposition unique.

Therefore the number of powerful numbers up to \(N\) is

$$P(N)=\sum_{\substack{1\le v\le \lfloor N^{1/3}\rfloor\\ v \text{ squarefree}}}\left\lfloor\sqrt{\frac{N}{v^3}}\right\rfloor.$$

For each squarefree \(v\), every integer \(u\) with \(u^2v^3\le N\) contributes one powerful number.

Step 2: Remove the cube-only obstruction

If \(u=1\), then \(n=v^3\) with \(v\) squarefree. Every nonzero prime exponent is then exactly \(3\), and the local equation

$$3=2x+3y,\qquad x,y\ge 0$$

forces \(x=0\). So any such representation has \(a=1\), which is forbidden.

Hence we must subtract

$$C(N)=\#\left\{v\le \lfloor N^{1/3}\rfloor : v \text{ squarefree}\right\}.$$

The same squarefree sieve used for \(P(N)\) also yields this correction term.

Step 3: Remove the square-only obstruction

If \(v=1\), then \(n=u^2\) is a perfect square. Such a number is not automatically admissible. The obstruction occurs exactly when \(u\) is cubefree.

If \(u\) is cubefree, every prime exponent of \(n=u^2\) is either \(2\) or \(4\). Neither exponent can contribute a positive cube part, because

$$2=2x+3y,\qquad 4=2x+3y,\qquad x,y\ge 0$$

has only solutions with \(y=0\). Therefore every representation forces \(b=1\).

Conversely, if \(u\) contains a cube factor \(p^3\), then \(n\) contains \(p^6\), and we can allocate \(p^2\) to the square part and \(p^3\) to the cube part, making both \(a\) and \(b\) greater than \(1\).

So we subtract the number of cubefree integers up to \(\lfloor\sqrt N\rfloor\):

$$Q(X)=\#\left\{u\le X : u \text{ cubefree}\right\},\qquad X=\lfloor\sqrt N\rfloor.$$

By Möbius inversion,

$$Q(X)=\sum_{d=1}^{\lfloor X^{1/3}\rfloor}\mu(d)\left\lfloor\frac{X}{d^3}\right\rfloor.$$

Step 4: Handle the residual sixth-power exception

After removing the previous two boundary families, one exceptional type remains: prime sixth powers \(p^6\).

For a single-prime exponent \(e\), the requirement that both factors be nontrivial is

$$e=2x+3y,\qquad x\ge 1,\qquad y\ge 1.$$

This has solutions for \(e=5\) and for every \(e\ge 7\), but not for \(e=6\). Thus \(p^6\) is powerful, is not a squarefree cube, and is not a square with cubefree root, yet it still cannot be written with both \(a>1\) and \(b>1\).

If a powerful number has at least two distinct prime factors and survives Steps 2 and 3, then one prime can supply a square factor while another supplies a cube factor. So the only leftover obstruction is

$$R(N)=\pi\left(\lfloor N^{1/6}\rfloor\right),$$

the number of prime sixth powers up to \(N\).

Step 5: Assemble the final formula

The number \(1\) is included in \(P(N)\), and it is removed once by the squarefree-cube correction and once by the cubefree-square correction. Since it should be excluded only once, we add \(1\) back.

Therefore

$$\boxed{F(N)=P(N)-C(N)-Q(\lfloor\sqrt N\rfloor)-R(N)+1.}$$

This is exactly the formula implemented by the C++, Python, and Java implementations.

Worked Example: \(N=100\)

Here \(\lfloor N^{1/3}\rfloor=4\), and the squarefree values are \(1,2,3\). So

$$P(100)=\left\lfloor\sqrt{100}\right\rfloor+\left\lfloor\sqrt{\frac{100}{8}}\right\rfloor+\left\lfloor\sqrt{\frac{100}{27}}\right\rfloor=10+3+1=14.$$

Next, \(C(100)=3\), coming from \(1^3,2^3,3^3\). Also \(\lfloor\sqrt{100}\rfloor=10\), and the cubefree integers up to \(10\) are

$$1,2,3,4,5,6,7,9,10,$$

so \(Q(10)=9\). Finally, \(\lfloor 100^{1/6}\rfloor=2\), hence \(R(100)=\pi(2)=1\).

Therefore

$$F(100)=14-3-9-1+1=2.$$

The two admissible numbers are \(64=2^2\cdot 2^3\) and \(72=3^2\cdot 2^3\).

How the Code Works

The C++, Python, and Java implementations follow the same pipeline. First they compute exact integer square roots, cube roots, and sixth roots. Each root starts from a floating-point estimate and then uses short correction loops, which removes boundary errors near \(64\)-bit limits.

They then mark squarefree integers up to \(\lfloor N^{1/3}\rfloor\) by crossing out multiples of \(p^2\) for primes \(p\le \lfloor N^{1/6}\rfloor\). Scanning that array simultaneously gives the base sum \(P(N)\) and the correction \(C(N)\).

For the cubefree correction, the implementation computes Möbius values up to \(\lfloor N^{1/6}\rfloor\) with a sieve and evaluates

$$\sum_{d\le \lfloor N^{1/6}\rfloor}\mu(d)\left\lfloor\frac{\lfloor\sqrt N\rfloor}{d^3}\right\rfloor.$$

Finally it counts primes up to \(\lfloor N^{1/6}\rfloor\) for the sixth-power correction and combines the four terms. The same formula is checked on small values such as \(N=100\), \(20000\), and \(3000000\) before evaluating the target input.

Complexity Analysis

Let \(V=\lfloor N^{1/3}\rfloor\) and \(D=\lfloor N^{1/6}\rfloor\). Marking squarefree integers up to \(V\) costs \(O(V\log\log V)\) time and \(O(V)\) memory. The Möbius sieve and the prime count up to \(D\) cost \(O(D)\) to \(O(D\log\log D)\) time and \(O(D)\) memory. Since \(V\) dominates \(D\), the overall method runs in \(O(N^{1/3}\log\log N)\) time with \(O(N^{1/3})\) memory.

Footnotes and References

  1. Problem page: Project Euler 634
  2. Powerful numbers: Wikipedia — Powerful number
  3. Squarefree integers: Wikipedia — Square-free integer
  4. Möbius function and inversion: Wikipedia — Möbius function
  5. Inclusion-exclusion principle: Wikipedia — Inclusion-exclusion principle

Problemzusammenfassung

Gesucht ist die Anzahl der ganzen Zahlen \(n \le N\) mit \(N=9\times 10^{18}\), die sich in der Form

$$n=a^2b^3,\qquad a>1,\qquad b>1$$

schreiben lassen. Eine direkte Suche bis \(N\) ist unmöglich, daher zählt die Lösung zunächst eine größere Klasse von Zahlen und entfernt danach genau die Fälle, die trotz dieser Vorzählung die Bedingungen \(a>1\) und \(b>1\) noch verletzen.

Mathematischer Ansatz

Wir definieren

$$F(N)=\#\left\{n\le N : n=a^2b^3 \text{ für gewisse } a,b>1\right\}.$$

Hat \(n=\prod p^{e_p}\) die Form \(a^2b^3\), dann gilt für jeden Primexponenten \(e_p\ge 2\). Jede gesuchte Zahl ist also eine mächtige Zahl. Die Implementierungen zählen deshalb zunächst alle mächtigen Zahlen bis \(N\) und subtrahieren anschließend jene mächtigen Zahlen, die dennoch keine echte Darstellung mit beiden Faktoren größer als \(1\) besitzen.

Schritt 1: Alle mächtigen Zahlen über die kanonische Form zählen

Jede mächtige Zahl besitzt eine eindeutige Darstellung

$$n=u^2v^3,$$

wobei \(v\) quadratfrei ist. Für jeden Primexponenten \(e\ge 2\) schreiben wir

$$e=2\alpha+3\beta,\qquad \beta\in\{0,1\},$$

sodass die Parität von \(e\) festlegt, ob die entsprechende Primzahl einmal in \(v\) erscheint. Genau daraus folgt die Eindeutigkeit.

Damit ist die Anzahl aller mächtigen Zahlen bis \(N\)

$$P(N)=\sum_{\substack{1\le v\le \lfloor N^{1/3}\rfloor\\ v \text{ squarefree}}}\left\lfloor\sqrt{\frac{N}{v^3}}\right\rfloor.$$

Für jedes quadratfreie \(v\) trägt jedes \(u\) mit \(u^2v^3\le N\) genau eine mächtige Zahl bei.

Schritt 2: Die reine Kubus-Schranke entfernen

Ist \(u=1\), so gilt \(n=v^3\) mit quadratfreiem \(v\). Dann ist jeder von Null verschiedene Primexponent gleich \(3\), und die lokale Gleichung

$$3=2x+3y,\qquad x,y\ge 0$$

erzwingt \(x=0\). Also hat jede solche Darstellung notwendigerweise \(a=1\), was verboten ist.

Daher müssen wir subtrahieren

$$C(N)=\#\left\{v\le \lfloor N^{1/3}\rfloor : v \text{ squarefree}\right\}.$$

Dasselbe Quadratfrei-Sieb, das \(P(N)\) liefert, liefert auch diesen Korrekturterm.

Schritt 3: Die reine Quadrat-Schranke entfernen

Ist \(v=1\), dann ist \(n=u^2\) ein perfektes Quadrat. Doch nicht jedes solche Quadrat ist zulässig. Das Hindernis tritt genau dann auf, wenn \(u\) kubusfrei ist.

Ist \(u\) kubusfrei, dann sind alle Primexponenten von \(n=u^2\) entweder \(2\) oder \(4\). Keiner dieser Exponenten kann einen positiven Kubusanteil liefern, denn

$$2=2x+3y,\qquad 4=2x+3y,\qquad x,y\ge 0$$

besitzt nur Lösungen mit \(y=0\). Damit ist in jeder Darstellung zwangsläufig \(b=1\).

Enthält \(u\) hingegen einen Kubusfaktor \(p^3\), dann enthält \(n\) einen Faktor \(p^6\). Man kann also \(p^2\) dem Quadratteil und \(p^3\) dem Kubusteil zuordnen, sodass beide Faktoren größer als \(1\) sind.

Folglich subtrahieren wir die Anzahl kubusfreier Zahlen bis \(\lfloor\sqrt N\rfloor\):

$$Q(X)=\#\left\{u\le X : u \text{ cubefree}\right\},\qquad X=\lfloor\sqrt N\rfloor.$$

Mit Möbius-Inversion gilt

$$Q(X)=\sum_{d=1}^{\lfloor X^{1/3}\rfloor}\mu(d)\left\lfloor\frac{X}{d^3}\right\rfloor.$$

Schritt 4: Die verbleibende Ausnahme der sechsten Primzahlpotenzen

Nach den beiden Randkorrekturen bleibt genau ein Ausnahmetyp übrig: Primzahl-Sechstpotenzen \(p^6\).

Für einen einzelnen Primexponenten \(e\) lautet die Bedingung, dass beide Faktoren nichttrivial sein sollen,

$$e=2x+3y,\qquad x\ge 1,\qquad y\ge 1.$$

Diese Gleichung ist für \(e=5\) und für alle \(e\ge 7\) lösbar, aber nicht für \(e=6\). Also ist \(p^6\) zwar mächtig, weder ein quadratfreier Kubus noch ein Quadrat mit kubusfreier Wurzel, aber trotzdem nicht in der geforderten Form mit \(a>1\) und \(b>1\) darstellbar.

Hat eine mächtige Zahl mindestens zwei verschiedene Primfaktoren und überlebt sie Schritt 2 und 3, dann kann eine Primzahl den Quadratteil und eine andere den Kubusteil liefern. Deshalb bleibt nur

$$R(N)=\pi\left(\lfloor N^{1/6}\rfloor\right)$$

als Korrekturterm übrig, also die Anzahl der Primzahl-Sechstpotenzen bis \(N\).

Schritt 5: Die Endformel zusammensetzen

Die Zahl \(1\) ist in \(P(N)\) enthalten und wird sowohl durch die Korrektur für quadratfreie Kuben als auch durch die Korrektur für kubusfreie Quadrate entfernt. Da sie insgesamt nur einmal ausgeschlossen werden soll, addieren wir am Ende \(1\) zurück.

Damit erhält man

$$\boxed{F(N)=P(N)-C(N)-Q(\lfloor\sqrt N\rfloor)-R(N)+1.}$$

Genau diese Formel setzen die C++, Python- und Java-Implementierungen um.

Durchgerechnetes Beispiel: \(N=100\)

Hier ist \(\lfloor N^{1/3}\rfloor=4\), und die quadratfreien Werte sind \(1,2,3\). Also

$$P(100)=\left\lfloor\sqrt{100}\right\rfloor+\left\lfloor\sqrt{\frac{100}{8}}\right\rfloor+\left\lfloor\sqrt{\frac{100}{27}}\right\rfloor=10+3+1=14.$$

Weiter ist \(C(100)=3\), nämlich \(1^3,2^3,3^3\). Zudem gilt \(\lfloor\sqrt{100}\rfloor=10\), und die kubusfreien Zahlen bis \(10\) sind

$$1,2,3,4,5,6,7,9,10,$$

also \(Q(10)=9\). Schließlich ist \(\lfloor 100^{1/6}\rfloor=2\), also \(R(100)=\pi(2)=1\).

Daher

$$F(100)=14-3-9-1+1=2.$$

Die beiden zulässigen Zahlen sind \(64=2^2\cdot 2^3\) und \(72=3^2\cdot 2^3\).

Wie der Code arbeitet

Die C++, Python- und Java-Implementierungen verwenden dieselbe Rechenkette. Zuerst bestimmen sie exakte ganzzahlige Quadrat-, Kubik- und sechste Wurzeln. Dazu dient jeweils eine Gleitkomma-Näherung, die anschließend mit kurzen Korrekturschleifen exakt auf den richtigen ganzzahligen Wert gebracht wird.

Danach markieren sie alle quadratfreien Zahlen bis \(\lfloor N^{1/3}\rfloor\), indem Vielfache von \(p^2\) für Primzahlen \(p\le \lfloor N^{1/6}\rfloor\) gestrichen werden. Beim Durchlauf über dieses Feld entstehen gleichzeitig die Basissumme \(P(N)\) und die Korrektur \(C(N)\).

Für die kubusfreie Korrektur berechnet die Implementierung per Sieb die Möbius-Werte bis \(\lfloor N^{1/6}\rfloor\) und wertet

$$\sum_{d\le \lfloor N^{1/6}\rfloor}\mu(d)\left\lfloor\frac{\lfloor\sqrt N\rfloor}{d^3}\right\rfloor$$

aus. Zum Schluss wird die Anzahl der Primzahlen bis \(\lfloor N^{1/6}\rfloor\) für die Sechstpotenz-Korrektur bestimmt und alles zusammengesetzt. Die Formel wird zuvor noch an kleinen Testwerten wie \(N=100\), \(20000\) und \(3000000\) geprüft.

Komplexitätsanalyse

Sei \(V=\lfloor N^{1/3}\rfloor\) und \(D=\lfloor N^{1/6}\rfloor\). Das Markieren der quadratfreien Zahlen bis \(V\) kostet \(O(V\log\log V)\) Zeit und \(O(V)\) Speicher. Das Möbius-Sieb und das Primzahlzählen bis \(D\) benötigen \(O(D)\) bis \(O(D\log\log D)\) Zeit sowie \(O(D)\) Speicher. Weil \(V\) deutlich größer als \(D\) ist, ergibt sich insgesamt \(O(N^{1/3}\log\log N)\) Zeit bei \(O(N^{1/3})\) Speicher.

Fußnoten und Referenzen

  1. Problemseite: Project Euler 634
  2. Mächtige Zahlen: Wikipedia — Vollmächtige Zahl
  3. Quadratfreie Zahlen: Wikipedia — Quadratfreie Zahl
  4. Möbius-Funktion: Wikipedia — Möbiusfunktion
  5. Inklusions-Exklusions-Prinzip: Wikipedia — Siebformel

Problem Özeti

Aranan değer, \(N=9\times 10^{18}\) için

$$n=a^2b^3,\qquad a>1,\qquad b>1$$

şeklinde yazılabilen \(n\le N\) tamsayılarının sayısıdır. \(N\) çok büyük olduğu için doğrudan tarama yapılamaz. Bu nedenle çözüm önce daha geniş bir sayı sınıfını sayar, sonra gerçekten uygun olmayan istisna ailelerini çıkarır.

Matematiksel Yaklaşım

Şunu tanımlayalım:

$$F(N)=\#\left\{n\le N : n=a^2b^3 \text{ olacak şekilde } a,b>1\right\}.$$

Eğer \(n=\prod p^{e_p}\) sayısı \(a^2b^3\) biçimindeyse her asal üs için \(e_p\ge 2\) olur. Yani aranan her sayı güçlü sayıdır. Uygulamalar önce \(N\)'e kadar olan tüm güçlü sayıları sayar, ardından güçlü olup da yine de \(a>1\) ve \(b>1\) koşullarını sağlayamayan sayıları çıkarır.

Adım 1: Kanonik ayrışımla tüm güçlü sayıları say

Her güçlü sayı tekil biçimde

$$n=u^2v^3$$

şeklinde yazılır; burada \(v\) karefree'dir. Gerçekten de her \(e\ge 2\) asal üssü için

$$e=2\alpha+3\beta,\qquad \beta\in\{0,1\}$$

yazılabilir. Üssün tek veya çift olması, ilgili asalın \(v\)'ye bir kez girip girmediğini belirler. Bu yüzden ayrışım tektir.

Dolayısıyla \(N\)'e kadar olan tüm güçlü sayıların sayısı

$$P(N)=\sum_{\substack{1\le v\le \lfloor N^{1/3}\rfloor\\ v \text{ squarefree}}}\left\lfloor\sqrt{\frac{N}{v^3}}\right\rfloor$$

olur. Her karefree \(v\) için, \(u^2v^3\le N\) sağlayan her \(u\) bir güçlü sayı üretir.

Adım 2: Sadece küp tarafı olan engeli çıkar

Eğer \(u=1\) ise \(n=v^3\) olur ve \(v\) karefree'dir. Bu durumda sıfır olmayan her asal üs tam olarak \(3\)'tür. Yerel denklem

$$3=2x+3y,\qquad x,y\ge 0$$

sadece \(x=0\) ile çözülebilir. Dolayısıyla böyle bir sayının her gösteriminde \(a=1\) olur; bu da yasaktır.

Bu yüzden

$$C(N)=\#\left\{v\le \lfloor N^{1/3}\rfloor : v \text{ squarefree}\right\}$$

miktarını çıkarmamız gerekir. Karefree taraması zaten yapıldığı için bu düzeltme aynı döngü içinde elde edilir.

Adım 3: Sadece kare tarafı olan engeli çıkar

Eğer \(v=1\) ise \(n=u^2\) tam karedir. Fakat her tam kare geçerli değildir. Sorun tam olarak \(u\) küpfree olduğunda ortaya çıkar.

\(u\) küpfree ise \(n=u^2\) sayısındaki asal üsler yalnızca \(2\) veya \(4\) olabilir. Bu üslerden hiçbiri pozitif bir küp payı veremez, çünkü

$$2=2x+3y,\qquad 4=2x+3y,\qquad x,y\ge 0$$

denklemlerinin bütün çözümlerinde \(y=0\) olur. Böylece her gösterimde zorunlu olarak \(b=1\) kalır.

Tersine, eğer \(u\) içinde bir \(p^3\) çarpanı varsa, \(n\) içinde \(p^6\) bulunur. O zaman \(p^2\) kare kısmına, \(p^3\) küp kısmına verilebilir; dolayısıyla hem \(a\) hem \(b\) \(1\)'den büyük olur.

Bu nedenle \(\lfloor\sqrt N\rfloor\)'ye kadar olan küpfree sayıların sayısını çıkarırız:

$$Q(X)=\#\left\{u\le X : u \text{ cubefree}\right\},\qquad X=\lfloor\sqrt N\rfloor.$$

Möbius terslemesiyle

$$Q(X)=\sum_{d=1}^{\lfloor X^{1/3}\rfloor}\mu(d)\left\lfloor\frac{X}{d^3}\right\rfloor$$

elde edilir.

Adım 4: Kalan altıncı kuvvet istisnasını ele al

Önceki iki sınır ailesini çıkardıktan sonra geriye tek bir istisna tipi kalır: asal altıncı kuvvetler \(p^6\).

Tek bir asal için, her iki tarafın da önemsiz olmaması şartı

$$e=2x+3y,\qquad x\ge 1,\qquad y\ge 1$$

şeklindedir. Bu denklem \(e=5\) ve tüm \(e\ge 7\) için çözülür, fakat \(e=6\) için çözülmez. Bu yüzden \(p^6\), güçlü bir sayı olmasına rağmen ne karefree bir küptür ne de küpfree köklü bir karedir; buna rağmen \(a>1\) ve \(b>1\) ile yazılamaz.

Eğer güçlü bir sayı en az iki farklı asal içeriyorsa ve Adım 2 ile Adım 3'ten sağ çıkıyorsa, bir asal kare katkısını, başka bir asal da küp katkısını verebilir. O halde geriye kalan tek engel

$$R(N)=\pi\left(\lfloor N^{1/6}\rfloor\right)$$

olur; yani \(N\)'e kadar olan asal altıncı kuvvetlerin sayısı.

Adım 5: Son formülü kur

\(1\) sayısı \(P(N)\) içinde vardır; karefree küp düzeltmesi onu bir kez, küpfree kare düzeltmesi de bir kez daha çıkarır. Oysa toplamda yalnızca bir kez dışarıda kalmalıdır. Bu yüzden sonda \(+1\) eklenir.

Böylece

$$\boxed{F(N)=P(N)-C(N)-Q(\lfloor\sqrt N\rfloor)-R(N)+1.}$$

formülüne ulaşılır. C++, Python ve Java uygulamaları tam olarak bu ifadeyi hesaplar.

Çözümlü Örnek: \(N=100\)

Burada \(\lfloor N^{1/3}\rfloor=4\) ve karefree değerler \(1,2,3\)'tür. Dolayısıyla

$$P(100)=\left\lfloor\sqrt{100}\right\rfloor+\left\lfloor\sqrt{\frac{100}{8}}\right\rfloor+\left\lfloor\sqrt{\frac{100}{27}}\right\rfloor=10+3+1=14.$$

Sonra \(C(100)=3\) gelir; bunlar \(1^3,2^3,3^3\)'tür. Ayrıca \(\lfloor\sqrt{100}\rfloor=10\) ve \(10\)'a kadar küpfree sayılar

$$1,2,3,4,5,6,7,9,10$$

olduğu için \(Q(10)=9\) olur. Son olarak \(\lfloor 100^{1/6}\rfloor=2\), dolayısıyla \(R(100)=\pi(2)=1\).

Böylece

$$F(100)=14-3-9-1+1=2.$$

Geçerli iki sayı \(64=2^2\cdot 2^3\) ve \(72=3^2\cdot 2^3\)'tür.

Kod Nasıl Çalışır

C++, Python ve Java uygulamaları aynı işlem hattını izler. Önce tam sayı karekök, küpkök ve altıncı kök değerleri hesaplanır. Her biri kayan noktalı bir tahminle başlar, ardından kısa düzeltme döngüleriyle sınır durumları kesin tam sayıya getirilir.

Daha sonra \(\lfloor N^{1/3}\rfloor\)'ye kadar olan karefree sayılar, \(p\le \lfloor N^{1/6}\rfloor\) asalları için \(p^2\) katları işaretlenerek bulunur. Bu dizi taranırken hem temel toplam \(P(N)\) hem de düzeltme \(C(N)\) aynı anda elde edilir.

Küpfree düzeltme için uygulama, \(\lfloor N^{1/6}\rfloor\)'ye kadar Möbius değerlerini bir sieve ile üretir ve

$$\sum_{d\le \lfloor N^{1/6}\rfloor}\mu(d)\left\lfloor\frac{\lfloor\sqrt N\rfloor}{d^3}\right\rfloor$$

toplamını hesaplar. Son olarak altıncı kuvvet düzeltmesi için \(\lfloor N^{1/6}\rfloor\)'ye kadar asallar sayılır ve dört terim birleştirilir. Aynı formül hedef girdi öncesinde \(N=100\), \(20000\) ve \(3000000\) gibi küçük kontrol değerlerinde de doğrulanır.

Karmaşıklık Analizi

\(V=\lfloor N^{1/3}\rfloor\) ve \(D=\lfloor N^{1/6}\rfloor\) olsun. \(V\)'ye kadar karefree işaretleme \(O(V\log\log V)\) zaman ve \(O(V)\) bellek kullanır. Möbius sievesi ve \(D\)'ye kadar asal sayımı \(O(D)\) ile \(O(D\log\log D)\) arasında zaman ve \(O(D)\) bellek gerektirir. \(V\), \(D\)'den büyük olduğu için toplam maliyet \(O(N^{1/3}\log\log N)\) zaman ve \(O(N^{1/3})\) bellek düzeyindedir.

Dipnotlar ve Kaynaklar

  1. Problem sayfası: Project Euler 634
  2. Güçlü sayılar: Wikipedia — Powerful number
  3. Karefree sayılar: Vikipedi — Kare böleni olmayan tamsayı
  4. Möbius fonksiyonu: Vikipedi — Möbius fonksiyonu
  5. Dahil et-çıkar ilkesi: Vikipedi — Dahil etme-dışlama prensibi

Resumen del Problema

Se pide contar cuántos enteros \(n \le N\), con \(N=9\times 10^{18}\), pueden escribirse como

$$n=a^2b^3,\qquad a>1,\qquad b>1.$$

Recorrer todos los valores hasta \(N\) es inviable. La idea es contar primero una familia más amplia de números y luego restar exactamente los casos excepcionales que todavía no satisfacen simultáneamente \(a>1\) y \(b>1\).

Enfoque Matemático

Definimos

$$F(N)=\#\left\{n\le N : n=a^2b^3 \text{ para algunos } a,b>1\right\}.$$

Si \(n=\prod p^{e_p}\) tiene la forma \(a^2b^3\), entonces cada exponente primo cumple \(e_p\ge 2\). Por tanto, todo número válido es un número poderoso. Las implementaciones cuentan primero todos los números poderosos hasta \(N\) y después restan los que, aun siendo poderosos, no admiten una representación con ambos factores estrictamente mayores que \(1\).

Paso 1: Contar todos los números poderosos mediante la forma canónica

Todo número poderoso posee una representación única

$$n=u^2v^3,$$

donde \(v\) es libre de cuadrados. En efecto, para cada exponente primo \(e\ge 2\) escribimos

$$e=2\alpha+3\beta,\qquad \beta\in\{0,1\},$$

de modo que la paridad de \(e\) decide si ese primo aparece una vez en \(v\). Eso hace única la descomposición.

Así, el número total de números poderosos hasta \(N\) es

$$P(N)=\sum_{\substack{1\le v\le \lfloor N^{1/3}\rfloor\\ v \text{ squarefree}}}\left\lfloor\sqrt{\frac{N}{v^3}}\right\rfloor.$$

Para cada \(v\) libre de cuadrados, cada entero \(u\) con \(u^2v^3\le N\) aporta exactamente un número poderoso.

Paso 2: Restar la obstrucción de tipo solo cubo

Si \(u=1\), entonces \(n=v^3\) con \(v\) libre de cuadrados. En ese caso, cada exponente primo no nulo vale exactamente \(3\), y la ecuación local

$$3=2x+3y,\qquad x,y\ge 0$$

obliga a \(x=0\). Por consiguiente, cualquier representación tiene \(a=1\), lo cual no está permitido.

Debemos restar entonces

$$C(N)=\#\left\{v\le \lfloor N^{1/3}\rfloor : v \text{ squarefree}\right\}.$$

El mismo tamiz de números libres de cuadrados que se usa para \(P(N)\) produce también este término de corrección.

Paso 3: Restar la obstrucción de tipo solo cuadrado

Si \(v=1\), entonces \(n=u^2\) es un cuadrado perfecto. Pero no todo cuadrado perfecto es válido. El obstáculo aparece exactamente cuando \(u\) es libre de cubos.

Si \(u\) es libre de cubos, todos los exponentes primos de \(n=u^2\) son \(2\) o \(4\). Ninguno de esos exponentes puede aportar una parte cúbica positiva, porque

$$2=2x+3y,\qquad 4=2x+3y,\qquad x,y\ge 0$$

solo tiene soluciones con \(y=0\). Por tanto, toda representación fuerza \(b=1\).

En cambio, si \(u\) contiene un factor cúbico \(p^3\), entonces \(n\) contiene \(p^6\), y podemos asignar \(p^2\) a la parte cuadrática y \(p^3\) a la parte cúbica. Así ambos factores quedan mayores que \(1\).

Por eso restamos la cantidad de enteros libres de cubos hasta \(\lfloor\sqrt N\rfloor\):

$$Q(X)=\#\left\{u\le X : u \text{ cubefree}\right\},\qquad X=\lfloor\sqrt N\rfloor.$$

Mediante inversión de Möbius,

$$Q(X)=\sum_{d=1}^{\lfloor X^{1/3}\rfloor}\mu(d)\left\lfloor\frac{X}{d^3}\right\rfloor.$$

Paso 4: Tratar la excepción residual de las sextas potencias primas

Después de eliminar las dos familias de borde anteriores, queda una sola excepción: las sextas potencias primas \(p^6\).

Para un único exponente primo \(e\), exigir que ambos factores sean no triviales equivale a

$$e=2x+3y,\qquad x\ge 1,\qquad y\ge 1.$$

Esto tiene solución para \(e=5\) y para todo \(e\ge 7\), pero falla en \(e=6\). Por eso \(p^6\) es poderoso, no es un cubo libre de cuadrados y tampoco es un cuadrado con raíz libre de cubos, pero aun así no se puede escribir con \(a>1\) y \(b>1\).

Si un número poderoso tiene al menos dos primos distintos y supera los Pasos 2 y 3, un primo puede aportar la parte cuadrática y otro la parte cúbica. Así, la única obstrucción restante es

$$R(N)=\pi\left(\lfloor N^{1/6}\rfloor\right),$$

el número de sextas potencias primas no mayores que \(N\).

Paso 5: Ensamblar la fórmula final

El número \(1\) está incluido en \(P(N)\) y se resta una vez en la corrección de cubos libres de cuadrados y otra vez en la corrección de cuadrados con raíz libre de cubos. Como debe excluirse solo una vez, añadimos \(1\) al final.

En consecuencia,

$$\boxed{F(N)=P(N)-C(N)-Q(\lfloor\sqrt N\rfloor)-R(N)+1.}$$

Esa es exactamente la fórmula evaluada por las implementaciones en C++, Python y Java.

Ejemplo Trabajado: \(N=100\)

Aquí \(\lfloor N^{1/3}\rfloor=4\), y los valores libres de cuadrados son \(1,2,3\). Entonces

$$P(100)=\left\lfloor\sqrt{100}\right\rfloor+\left\lfloor\sqrt{\frac{100}{8}}\right\rfloor+\left\lfloor\sqrt{\frac{100}{27}}\right\rfloor=10+3+1=14.$$

Luego \(C(100)=3\), procedente de \(1^3,2^3,3^3\). Además \(\lfloor\sqrt{100}\rfloor=10\), y los enteros libres de cubos hasta \(10\) son

$$1,2,3,4,5,6,7,9,10,$$

de modo que \(Q(10)=9\). Por último, \(\lfloor 100^{1/6}\rfloor=2\), así que \(R(100)=\pi(2)=1\).

Por tanto,

$$F(100)=14-3-9-1+1=2.$$

Los dos números válidos son \(64=2^2\cdot 2^3\) y \(72=3^2\cdot 2^3\).

Cómo Funciona el Código

Las implementaciones en C++, Python y Java siguen la misma secuencia. Primero calculan raíces enteras exactas de orden \(2\), \(3\) y \(6\). Cada cálculo parte de una aproximación en coma flotante y luego la corrige con pequeños bucles, evitando errores de borde cerca del límite de \(64\) bits.

Después marcan los enteros libres de cuadrados hasta \(\lfloor N^{1/3}\rfloor\) tachando los múltiplos de \(p^2\) para los primos \(p\le \lfloor N^{1/6}\rfloor\). Al recorrer ese arreglo obtienen a la vez la suma base \(P(N)\) y la corrección \(C(N)\).

Para la corrección de números libres de cubos, la implementación calcula los valores de Möbius hasta \(\lfloor N^{1/6}\rfloor\) con un tamiz y evalúa

$$\sum_{d\le \lfloor N^{1/6}\rfloor}\mu(d)\left\lfloor\frac{\lfloor\sqrt N\rfloor}{d^3}\right\rfloor.$$

Al final cuenta los primos hasta \(\lfloor N^{1/6}\rfloor\) para la corrección de sextas potencias y combina los cuatro términos. La misma fórmula se verifica antes en valores pequeños como \(N=100\), \(20000\) y \(3000000\).

Análisis de Complejidad

Sea \(V=\lfloor N^{1/3}\rfloor\) y \(D=\lfloor N^{1/6}\rfloor\). Marcar los enteros libres de cuadrados hasta \(V\) cuesta \(O(V\log\log V)\) tiempo y \(O(V)\) memoria. El tamiz de Möbius y el conteo de primos hasta \(D\) cuestan entre \(O(D)\) y \(O(D\log\log D)\) tiempo, con \(O(D)\) memoria. Como \(V\) domina a \(D\), el método completo requiere \(O(N^{1/3}\log\log N)\) tiempo y \(O(N^{1/3})\) memoria.

Notas y Referencias

  1. Página del problema: Project Euler 634
  2. Números poderosos: Wikipedia — Número poderoso
  3. Enteros libres de cuadrados: Wikipedia — Número libre de cuadrados
  4. Función de Möbius: Wikipedia — Función de Möbius
  5. Principio de inclusión-exclusión: Wikipedia — Principio de inclusión-exclusión

问题概述

题目要求统计满足 \(n\le N\) 且

$$n=a^2b^3,\qquad a>1,\qquad b>1$$

的整数个数,其中 \(N=9\times 10^{18}\)。直接枚举到 \(N\) 完全不可行,所以解法不是逐个检查整数,而是先统计一个更容易描述的超集,再把其中不合法的特殊情形精确扣掉。

数学方法

$$F(N)=\#\left\{n\le N : n=a^2b^3 \text{ 且 } a,b>1\right\}.$$

如果 \(n=\prod p^{e_p}\) 可以写成 \(a^2b^3\),那么每个素因子的指数都至少是 \(2\),因为平方部分贡献偶数指数,立方部分贡献 \(3\) 的倍数,两者相加不可能得到 \(1\)。这说明所有候选数都属于 powerful number。程序的策略正是先把所有 powerful number 统计出来,再减去那些虽然 powerful、但依然无法满足 \(a>1\) 与 \(b>1\) 的数。

步骤 1:用规范分解统计全部 powerful number

每个 powerful number 都可以唯一写成

$$n=u^2v^3,$$

其中 \(v\) 是 squarefree。原因是:对任意素因子指数 \(e\ge 2\),都可以唯一写成

$$e=2\alpha+3\beta,\qquad \beta\in\{0,1\}.$$

\(\beta\) 只取 \(0\) 或 \(1\),恰好由指数的奇偶性决定;若 \(\beta=1\),该素数就在 \(v\) 中出现一次,因此 \(v\) 必然是 squarefree。这就得到唯一的规范表示。

于是,不超过 \(N\) 的 powerful number 总数为

$$P(N)=\sum_{\substack{1\le v\le \lfloor N^{1/3}\rfloor\\ v \text{ squarefree}}}\left\lfloor\sqrt{\frac{N}{v^3}}\right\rfloor.$$

对每个 squarefree 的 \(v\),所有满足 \(u^2v^3\le N\) 的正整数 \(u\) 都贡献一个 powerful number。

步骤 2:扣除“只有立方部分”的障碍

如果规范分解里 \(u=1\),那么 \(n=v^3\),而且 \(v\) 是 squarefree。此时所有非零素因子指数都恰好等于 \(3\)。要把它写成 \(a^2b^3\),对应单个素数必须满足

$$3=2x+3y,\qquad x,y\ge 0.$$

这个方程唯一可能是 \(x=0,y=1\),也就是说平方部分在每个素数上都没有贡献,于是整体上只能有 \(a=1\)。因此这类数全部不合法。

所以需要减去

$$C(N)=\#\left\{v\le \lfloor N^{1/3}\rfloor : v \text{ squarefree}\right\}.$$

实现中用于枚举 \(P(N)\) 的 squarefree 筛法,同时也顺手给出了这个修正项。

步骤 3:扣除“只有平方部分”的障碍

如果规范分解里 \(v=1\),那么 \(n=u^2\) 是完全平方数。但完全平方数并不一定都能写成要求的形式。真正有问题的,恰好是 \(u\) 为 cubefree 的情形。

若 \(u\) 是 cubefree,那么 \(u\) 的每个素因子指数都小于 \(3\),因此 \(n=u^2\) 中对应指数只能是 \(2\) 或 \(4\)。而

$$2=2x+3y,\qquad 4=2x+3y,\qquad x,y\ge 0$$

都只能在 \(y=0\) 时成立,这意味着立方部分根本不能出现,任何表示都只能让 \(b=1\)。

反过来,如果 \(u\) 含有某个立方因子 \(p^3\),那么 \(n=u^2\) 至少含有 \(p^6\)。这时完全可以把 \(p^2\) 分配给平方部分,把 \(p^3\) 分配给立方部分,于是 \(a>1\) 且 \(b>1\) 同时成立。

因此我们要减去不超过 \(\lfloor\sqrt N\rfloor\) 的 cubefree 整数个数:

$$Q(X)=\#\left\{u\le X : u \text{ cubefree}\right\},\qquad X=\lfloor\sqrt N\rfloor.$$

这个数量可以用 Möbius 反演写成

$$Q(X)=\sum_{d=1}^{\lfloor X^{1/3}\rfloor}\mu(d)\left\lfloor\frac{X}{d^3}\right\rfloor.$$

步骤 4:处理剩余的六次幂例外

减掉前面两个边界家族以后,还会剩下一类例外:素数六次幂 \(p^6\)。

对单个素数指数 \(e\) 来说,如果我们要求平方部分和立方部分都真正出现,那么必须有

$$e=2x+3y,\qquad x\ge 1,\qquad y\ge 1.$$

这个方程在 \(e=5\) 时可解,在所有 \(e\ge 7\) 时也可解,但在 \(e=6\) 时无解。因此 \(p^6\) 虽然是 powerful number,也不是前两步已经扣掉的两类边界情况,却仍然无法写成 \(a>1\)、\(b>1\) 的形式。

如果一个 powerful number 含有至少两个不同的素因子,并且没有在步骤 2 与步骤 3 中被排除,那么我们可以让某个素因子提供平方贡献,让另一个素因子提供立方贡献,于是它就是合法的。这样剩下唯一需要额外扣除的就是

$$R(N)=\pi\left(\lfloor N^{1/6}\rfloor\right),$$

也就是不超过 \(N\) 的素数六次幂个数。

步骤 5:拼出最终公式

数字 \(1\) 被包含在 \(P(N)\) 里,同时也会在“squarefree 立方修正”和“cubefree 平方修正”里各被减去一次。它本来只应该被排除一次,所以最后要补回 \(1\)。

最终得到

$$\boxed{F(N)=P(N)-C(N)-Q(\lfloor\sqrt N\rfloor)-R(N)+1.}$$

这正是 C++、Python 和 Java 实现共同计算的公式。

例子:\(N=100\)

此时 \(\lfloor N^{1/3}\rfloor=4\),其中 squarefree 的 \(v\) 只有 \(1,2,3\)。所以

$$P(100)=\left\lfloor\sqrt{100}\right\rfloor+\left\lfloor\sqrt{\frac{100}{8}}\right\rfloor+\left\lfloor\sqrt{\frac{100}{27}}\right\rfloor=10+3+1=14.$$

接着 \(C(100)=3\),对应 \(1^3,2^3,3^3\)。又因为 \(\lfloor\sqrt{100}\rfloor=10\),而不超过 \(10\) 的 cubefree 整数是

$$1,2,3,4,5,6,7,9,10,$$

所以 \(Q(10)=9\)。最后 \(\lfloor 100^{1/6}\rfloor=2\),因此 \(R(100)=\pi(2)=1\)。

于是

$$F(100)=14-3-9-1+1=2.$$

这两个合法整数正是 \(64=2^2\cdot 2^3\) 和 \(72=3^2\cdot 2^3\)。

代码如何工作

C++、Python 和 Java 三个实现采用同一条计算流程。首先,它们分别求精确的整数平方根、立方根和六次根。做法是先取一个浮点近似值,再用很短的修正循环向上或向下校正,从而避免接近 \(64\) 位边界时的舍入误差。

然后,程序在 \(\lfloor N^{1/3}\rfloor\) 范围内筛出 squarefree 整数,方法是对所有 \(p\le \lfloor N^{1/6}\rfloor\) 的素数,把 \(p^2\) 的倍数标记掉。扫描这个布尔数组时,就能同时得到基础统计 \(P(N)\) 和修正项 \(C(N)\)。

接下来,为了计算 cubefree 修正,程序先用筛法求出 \(\lfloor N^{1/6}\rfloor\) 以内的 Möbius 值,再计算

$$\sum_{d\le \lfloor N^{1/6}\rfloor}\mu(d)\left\lfloor\frac{\lfloor\sqrt N\rfloor}{d^3}\right\rfloor.$$

最后,还要统计 \(\lfloor N^{1/6}\rfloor\) 以内的素数个数,以获得六次幂修正项,然后把四个部分合并。正式求目标输入之前,程序还会用 \(N=100\)、\(20000\)、\(3000000\) 这些较小样例做一致性检查。

复杂度分析

设 \(V=\lfloor N^{1/3}\rfloor\),\(D=\lfloor N^{1/6}\rfloor\)。在 \(V\) 以内筛 squarefree 数需要 \(O(V\log\log V)\) 时间和 \(O(V)\) 空间。Möbius 筛与 \(D\) 以内的素数统计需要 \(O(D)\) 到 \(O(D\log\log D)\) 的时间,以及 \(O(D)\) 的空间。由于 \(V\) 远大于 \(D\),总复杂度由前者主导,因此整体为 \(O(N^{1/3}\log\log N)\) 时间和 \(O(N^{1/3})\) 空间。

注释与参考资料

  1. 题目页面:Project Euler 634
  2. Powerful number:Wikipedia — Powerful number
  3. Square-free integer:Wikipedia — Square-free integer
  4. Möbius function:Wikipedia — Möbius function
  5. Inclusion-exclusion principle:Wikipedia — Inclusion-exclusion principle

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

Нужно подсчитать количество целых чисел \(n \le N\), где \(N=9\times 10^{18}\), которые можно представить в виде

$$n=a^2b^3,\qquad a>1,\qquad b>1.$$

Прямой перебор до \(N\) невозможен. Поэтому решение сначала считает более широкий класс чисел, а затем вычитает из него те особые случаи, которые все еще не удовлетворяют одновременно условиям \(a>1\) и \(b>1\).

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

Обозначим

$$F(N)=\#\left\{n\le N : n=a^2b^3 \text{ для некоторых } a,b>1\right\}.$$

Если \(n=\prod p^{e_p}\) представимо в виде \(a^2b^3\), то каждый показатель \(e_p\) не меньше \(2\). Значит, каждое подходящее число является мощным числом. Поэтому реализации сначала считают все мощные числа до \(N\), а затем вычитают те из них, которые все равно не дают представления с обоими нетривиальными множителями.

Шаг 1: Посчитать все мощные числа через каноническое разложение

Любое мощное число единственным образом представляется как

$$n=u^2v^3,$$

где \(v\) squarefree. Для каждого простого показателя \(e\ge 2\) можно единственным образом записать

$$e=2\alpha+3\beta,\qquad \beta\in\{0,1\}.$$

Значение \(\beta\) определяется четностью \(e\), то есть именно она решает, входит ли соответствующий простой множитель один раз в \(v\). Отсюда и следует единственность представления.

Поэтому число всех мощных чисел не больше \(N\) равно

$$P(N)=\sum_{\substack{1\le v\le \lfloor N^{1/3}\rfloor\\ v \text{ squarefree}}}\left\lfloor\sqrt{\frac{N}{v^3}}\right\rfloor.$$

Для каждого squarefree числа \(v\) любое \(u\), удовлетворяющее \(u^2v^3\le N\), дает одно мощное число.

Шаг 2: Вычесть препятствие типа «только куб»

Если \(u=1\), то \(n=v^3\), причем \(v\) squarefree. Тогда каждый ненулевой простой показатель равен ровно \(3\), а локальное уравнение

$$3=2x+3y,\qquad x,y\ge 0$$

допускает только \(x=0\). Значит, в любом таком представлении обязательно \(a=1\), а это запрещено.

Следовательно, нужно вычесть

$$C(N)=\#\left\{v\le \lfloor N^{1/3}\rfloor : v \text{ squarefree}\right\}.$$

Тот же самый решетчатый проход по squarefree числам, который используется для \(P(N)\), сразу дает и этот поправочный член.

Шаг 3: Вычесть препятствие типа «только квадрат»

Если \(v=1\), то \(n=u^2\) является полным квадратом. Но не каждый полный квадрат подходит. Проблема возникает ровно тогда, когда \(u\) cubefree.

Если \(u\) cubefree, то все простые показатели в \(n=u^2\) равны \(2\) или \(4\). Ни один из этих показателей не может дать положительный кубический вклад, потому что

$$2=2x+3y,\qquad 4=2x+3y,\qquad x,y\ge 0$$

имеет решения только при \(y=0\). Значит, во всяком представлении обязательно получается \(b=1\).

Если же \(u\) содержит кубический множитель \(p^3\), то в \(n\) присутствует \(p^6\), и можно отдать \(p^2\) квадратной части, а \(p^3\) кубической части. Тогда оба множителя становятся больше \(1\).

Поэтому нужно вычесть число cubefree целых чисел до \(\lfloor\sqrt N\rfloor\):

$$Q(X)=\#\left\{u\le X : u \text{ cubefree}\right\},\qquad X=\lfloor\sqrt N\rfloor.$$

По формуле Мёбиуса

$$Q(X)=\sum_{d=1}^{\lfloor X^{1/3}\rfloor}\mu(d)\left\lfloor\frac{X}{d^3}\right\rfloor.$$

Шаг 4: Обработать оставшееся исключение шестых степеней простых

После вычитания двух граничных семейств остается еще один тип исключений: числа вида \(p^6\), где \(p\) простое.

Для одного простого показателя \(e\) условие нетривиальности обеих частей имеет вид

$$e=2x+3y,\qquad x\ge 1,\qquad y\ge 1.$$

Это уравнение решается при \(e=5\) и при всех \(e\ge 7\), но не решается при \(e=6\). Поэтому \(p^6\) является мощным числом, не попадает ни в squarefree кубы, ни в квадраты с cubefree корнем, и все же не представимо с \(a>1\) и \(b>1\).

Если мощное число имеет хотя бы два различных простых множителя и не вычитается на шагах 2 и 3, то один простой множитель может дать квадратную часть, а другой кубическую. Значит, остается вычесть только

$$R(N)=\pi\left(\lfloor N^{1/6}\rfloor\right),$$

то есть количество простых шестых степеней, не превосходящих \(N\).

Шаг 5: Собрать итоговую формулу

Число \(1\) входит в \(P(N)\), затем вычитается один раз в squarefree-кубической поправке и еще раз в cubefree-квадратной поправке. Поскольку его нужно исключить только один раз, в конце прибавляется \(1\).

Итак,

$$\boxed{F(N)=P(N)-C(N)-Q(\lfloor\sqrt N\rfloor)-R(N)+1.}$$

Именно эту формулу вычисляют реализации на C++, Python и Java.

Разобранный пример: \(N=100\)

Здесь \(\lfloor N^{1/3}\rfloor=4\), а squarefree значения равны \(1,2,3\). Поэтому

$$P(100)=\left\lfloor\sqrt{100}\right\rfloor+\left\lfloor\sqrt{\frac{100}{8}}\right\rfloor+\left\lfloor\sqrt{\frac{100}{27}}\right\rfloor=10+3+1=14.$$

Далее, \(C(100)=3\), что соответствует \(1^3,2^3,3^3\). Кроме того, \(\lfloor\sqrt{100}\rfloor=10\), а cubefree числа до \(10\) таковы:

$$1,2,3,4,5,6,7,9,10,$$

поэтому \(Q(10)=9\). Наконец, \(\lfloor 100^{1/6}\rfloor=2\), следовательно \(R(100)=\pi(2)=1\).

Отсюда

$$F(100)=14-3-9-1+1=2.$$

Два допустимых числа: \(64=2^2\cdot 2^3\) и \(72=3^2\cdot 2^3\).

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

Реализации на C++, Python и Java используют одну и ту же схему. Сначала они вычисляют точные целые квадратные, кубические и шестые корни. Для этого берется приближенное вещественное значение, а затем короткими корректирующими циклами устраняются погрешности на границах.

Затем они отмечают squarefree числа до \(\lfloor N^{1/3}\rfloor\), вычеркивая кратные \(p^2\) для простых \(p\le \lfloor N^{1/6}\rfloor\). Проход по этому массиву одновременно дает базовую сумму \(P(N)\) и поправку \(C(N)\).

Для cubefree-поправки программа вычисляет значения функции Мёбиуса до \(\lfloor N^{1/6}\rfloor\) с помощью решета и затем считает

$$\sum_{d\le \lfloor N^{1/6}\rfloor}\mu(d)\left\lfloor\frac{\lfloor\sqrt N\rfloor}{d^3}\right\rfloor.$$

После этого остается посчитать простые числа до \(\lfloor N^{1/6}\rfloor\) для поправки шестых степеней и объединить все четыре члена. До запуска на целевом входе формула проверяется на малых значениях \(N=100\), \(20000\) и \(3000000\).

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

Пусть \(V=\lfloor N^{1/3}\rfloor\), \(D=\lfloor N^{1/6}\rfloor\). Отметка squarefree чисел до \(V\) требует \(O(V\log\log V)\) времени и \(O(V)\) памяти. Решето Мёбиуса и подсчет простых до \(D\) требуют от \(O(D)\) до \(O(D\log\log D)\) времени и \(O(D)\) памяти. Так как \(V\) значительно больше \(D\), итоговая сложность равна \(O(N^{1/3}\log\log N)\) по времени и \(O(N^{1/3})\) по памяти.

Сноски и источники

  1. Страница задачи: Project Euler 634
  2. Мощные числа: Википедия — Мощное число
  3. Свободные от квадратов числа: Википедия — Бесквадратное число
  4. Функция Мёбиуса: Википедия — Функция Мёбиуса
  5. Принцип включения-исключения: Википедия — Формула включений — исключений

ملخص المشكلة

نريد حساب عدد الأعداد الصحيحة \(n \le N\) حيث \(N=9\times 10^{18}\) والتي يمكن كتابتها على الصورة

$$n=a^2b^3,\qquad a>1,\qquad b>1.$$

الفحص المباشر لكل القيم حتى \(N\) غير ممكن عمليًا. لذلك تعتمد الفكرة على عدّ فئة أوسع أولًا، ثم طرح الحالات الخاصة التي تبقى غير صالحة رغم أنها تنتمي إلى تلك الفئة الأوسع.

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

لنعرّف

$$F(N)=\#\left\{n\le N : n=a^2b^3,\ a>1,\ b>1\right\}.$$

إذا كان \(n=\prod p^{e_p}\) قابلاً للكتابة على صورة \(a^2b^3\)، فإن كل أسّ أولي يحقق \(e_p\ge 2\). إذن كل عدد مطلوب هو عدد قوي. لذلك تبدأ التطبيقات بعدّ جميع الأعداد القوية حتى \(N\)، ثم تطرح الأعداد القوية التي لا تزال غير قابلة لتمثيل مطلوب فيه كل من \(a\) و\(b\) أكبر من \(1\).

الخطوة 1: عدّ جميع الأعداد القوية عبر الصيغة القانونية

كل عدد قوي يملك تمثيلًا وحيدًا بالشكل

$$n=u^2v^3,$$

حيث يكون \(v\) squarefree. فلكل أسّ أولي \(e\ge 2\) نستطيع أن نكتب

$$e=2\alpha+3\beta,\qquad \beta\in\{0,1\}.$$

وتحدد فردية \(e\) هل يظهر ذلك العامل الأولي مرة واحدة داخل \(v\) أم لا، ولهذا يكون التحليل وحيدًا.

ومن ثم فإن عدد الأعداد القوية حتى \(N\) يساوي

$$P(N)=\sum_{\substack{1\le v\le \lfloor N^{1/3}\rfloor\\ v \text{ squarefree}}}\left\lfloor\sqrt{\frac{N}{v^3}}\right\rfloor.$$

فلكل \(v\) squarefree، كل قيمة \(u\) تحقق \(u^2v^3\le N\) تعطي عددًا قويًا واحدًا.

الخطوة 2: طرح حالة «الجزء التكعيبي فقط»

إذا كان \(u=1\)، يصبح \(n=v^3\) مع \(v\) squarefree. حينها يكون كل أسّ أولي غير صفري مساويًا تمامًا لـ\(3\)، والمعادلة المحلية

$$3=2x+3y,\qquad x,y\ge 0$$

تفرض \(x=0\). وهذا يعني أن أي تمثيل من هذا النوع يجعل \(a=1\)، وهو غير مسموح.

لذلك يجب طرح

$$C(N)=\#\left\{v\le \lfloor N^{1/3}\rfloor : v \text{ squarefree}\right\}.$$

والغربلة نفسها المستعملة لحساب \(P(N)\) تعطي هذا الحدّ التصحيحي أيضًا.

الخطوة 3: طرح حالة «الجزء التربيعي فقط»

إذا كان \(v=1\)، فإن \(n=u^2\) مربع كامل. لكن ليس كل مربع كامل صالحًا. تظهر المشكلة بالضبط عندما يكون \(u\) cubefree.

إذا كان \(u\) cubefree، فإن كل أسّ أولي في \(n=u^2\) يكون \(2\) أو \(4\). ولا يمكن لأي من هذين الأسّين أن يوفّر مساهمة تكعيبية موجبة، لأن

$$2=2x+3y,\qquad 4=2x+3y,\qquad x,y\ge 0$$

لا يملك إلا حلولًا فيها \(y=0\). وبالتالي فإن أي تمثيل يفرض \(b=1\).

أما إذا احتوى \(u\) على عامل تكعيبي \(p^3\)، فإن \(n\) يحتوي على \(p^6\)، وعندها يمكن إسناد \(p^2\) إلى الجزء التربيعي و\(p^3\) إلى الجزء التكعيبي، فيصبح كل من \(a\) و\(b\) أكبر من \(1\).

إذن نطرح عدد الأعداد cubefree حتى \(\lfloor\sqrt N\rfloor\):

$$Q(X)=\#\left\{u\le X : u \text{ cubefree}\right\},\qquad X=\lfloor\sqrt N\rfloor.$$

وباستخدام معكوس Möbius نحصل على

$$Q(X)=\sum_{d=1}^{\lfloor X^{1/3}\rfloor}\mu(d)\left\lfloor\frac{X}{d^3}\right\rfloor.$$

الخطوة 4: معالجة استثناء القوى السادسة الأولية

بعد طرح العائلتين السابقتين، تبقى حالة استثنائية واحدة: الأعداد من الشكل \(p^6\) حيث \(p\) أولي.

بالنسبة لأسّ أولي واحد \(e\)، فإن شرط أن يكون الجزآن غير تافهين هو

$$e=2x+3y,\qquad x\ge 1,\qquad y\ge 1.$$

هذه المعادلة تُحل عند \(e=5\) وعند كل \(e\ge 7\)، لكنها لا تُحل عند \(e=6\). لذلك فإن \(p^6\) عدد قوي، وليس مكعبًا squarefree، وليس مربعًا جذره cubefree، ومع ذلك لا يمكن كتابته بحيث يكون كل من \(a>1\) و\(b>1\).

إذا كان العدد القوي يحوي عاملين أوليين مختلفين على الأقل، ونجا من الطرح في الخطوتين 2 و3، فيمكن لعامل أولي أن يزوّد الجزء التربيعي وعامل آخر أن يزوّد الجزء التكعيبي. لذا فإن العائق المتبقي الوحيد هو

$$R(N)=\pi\left(\lfloor N^{1/6}\rfloor\right),$$

أي عدد القوى السادسة الأولية حتى \(N\).

الخطوة 5: تركيب الصيغة النهائية

العدد \(1\) محسوب داخل \(P(N)\)، ثم يُطرح مرة في تصحيح المكعبات squarefree ومرة أخرى في تصحيح المربعات ذات الجذر cubefree. ولأنه يجب استبعاده مرة واحدة فقط، فإننا نضيف \(1\) في النهاية.

إذن

$$\boxed{F(N)=P(N)-C(N)-Q(\lfloor\sqrt N\rfloor)-R(N)+1.}$$

وهذه هي الصيغة نفسها التي تطبقها البرامج المكتوبة بـ C++ وPython وJava.

مثال محلول: \(N=100\)

لدينا هنا \(\lfloor N^{1/3}\rfloor=4\)، والقيم squarefree هي \(1,2,3\). لذلك

$$P(100)=\left\lfloor\sqrt{100}\right\rfloor+\left\lfloor\sqrt{\frac{100}{8}}\right\rfloor+\left\lfloor\sqrt{\frac{100}{27}}\right\rfloor=10+3+1=14.$$

ثم إن \(C(100)=3\)، وهي القيم القادمة من \(1^3,2^3,3^3\). كذلك \(\lfloor\sqrt{100}\rfloor=10\)، والأعداد cubefree حتى \(10\) هي

$$1,2,3,4,5,6,7,9,10,$$

ومن ثم \(Q(10)=9\). وأخيرًا \(\lfloor 100^{1/6}\rfloor=2\)، لذا \(R(100)=\pi(2)=1\).

وعليه

$$F(100)=14-3-9-1+1=2.$$

والعددان الصالحان هما \(64=2^2\cdot 2^3\) و\(72=3^2\cdot 2^3\).

كيف تعمل الشيفرة

تتبع تطبيقات C++ وPython وJava المسار نفسه. تبدأ بحساب الجذر التربيعي الصحيح والجذر التكعيبي الصحيح والجذر السادس الصحيح. ويبدأ كل حساب بتقدير عائم، ثم تُستخدم حلقات تصحيح قصيرة لضبط القيمة بدقة عند الحدود الحساسة.

بعد ذلك تُعلَّم الأعداد squarefree حتى \(\lfloor N^{1/3}\rfloor\) عبر شطب مضاعفات \(p^2\) لكل عدد أولي \(p\le \lfloor N^{1/6}\rfloor\). والمسح على هذا الجدول يعطي في الوقت نفسه الحد الأساسي \(P(N)\) والتصحيح \(C(N)\).

أما تصحيح الأعداد cubefree، فيُحسب بعد توليد قيم Möbius حتى \(\lfloor N^{1/6}\rfloor\) باستخدام غربلة، ثم تقييم المجموع

$$\sum_{d\le \lfloor N^{1/6}\rfloor}\mu(d)\left\lfloor\frac{\lfloor\sqrt N\rfloor}{d^3}\right\rfloor.$$

وفي النهاية تُحسب أعداد الأوليات حتى \(\lfloor N^{1/6}\rfloor\) للحصول على تصحيح القوى السادسة، ثم تُجمع الحدود الأربعة. كما تُراجع الصيغة أولًا على قيم صغيرة مثل \(N=100\) و\(20000\) و\(3000000\) قبل تنفيذها على القيمة الهدف.

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

لنضع \(V=\lfloor N^{1/3}\rfloor\) و\(D=\lfloor N^{1/6}\rfloor\). تعليم الأعداد squarefree حتى \(V\) يكلف \(O(V\log\log V)\) زمنًا و\(O(V)\) ذاكرة. وغربلة Möbius مع عدّ الأوليات حتى \(D\) تكلف بين \(O(D)\) و\(O(D\log\log D)\) زمنًا مع \(O(D)\) ذاكرة. وبما أن \(V\) أكبر من \(D\)، فإن الكلفة الكلية تهيمن عليها مرحلة \(V\)، فتكون النتيجة \(O(N^{1/3}\log\log N)\) زمنًا و\(O(N^{1/3})\) ذاكرة.

الحواشي والمراجع

  1. صفحة المسألة: Project Euler 634
  2. الأعداد القوية: Wikipedia — Powerful number
  3. الأعداد squarefree: Wikipedia — Square-free integer
  4. دالة Möbius: Wikipedia — Möbius function
  5. مبدأ الشمول والاستبعاد: Wikipedia — Inclusion-exclusion principle