Problem Summary

We want all residues \(x\) satisfying

$$x^3\equiv1\pmod n,$$

and then we sum all nontrivial solutions, meaning all residues with \(1<x<n\). The default value used by the code is

$$n=13082761331670030=2\cdot3\cdot5\cdot7\cdot11\cdot13\cdot17\cdot19\cdot23\cdot29\cdot31\cdot37\cdot41\cdot43,$$

which is squarefree.

Mathematical Approach

1. Split the Problem Prime by Prime

Because \(n\) is squarefree, we may write

$$n=\prod_{i=1}^{k}p_i$$

with distinct primes \(p_i\). Then

$$x^3\equiv1\pmod n$$

is equivalent to the simultaneous system

$$x^3\equiv1\pmod{p_i}\qquad(i=1,\dots,k).$$

So the whole problem becomes:

1. find all cube roots of unity modulo each prime \(p_i\),

2. combine one local choice from each prime modulus using the Chinese Remainder Theorem.

2. How Many Cube Roots Exist Modulo a Prime?

For a prime \(p\), the nonzero residues modulo \(p\) form a cyclic multiplicative group of size \(p-1\). In a cyclic group of order \(p-1\), the equation

$$u^3=1$$

has exactly

$$\gcd(3,p-1)$$

solutions. Therefore:

1. if \(p\equiv2\pmod3\), then \(\gcd(3,p-1)=1\), so the only root is \(1\),

2. if \(p\equiv1\pmod3\), then \(\gcd(3,p-1)=3\), so there are three roots.

The code does not use a special generator argument; since every prime factor of the target \(n\) is small, it simply brute-forces all residues \(1\le x<p\) and keeps those with \(x^3\equiv1\pmod p\).

3. Small Local Examples

For \(p=7\), the roots are

$$R_7=\{1,2,4\},$$

because \(1^3\equiv2^3\equiv4^3\equiv1\pmod7\).

For \(p=13\), the roots are

$$R_{13}=\{1,3,9\}.$$

For primes such as \(5,11,17,23,29,41\), which are \(2\pmod3\), the local root set is just \(\{1\}\).

4. Chinese Remainder Reconstruction

Once we choose one root \(r_i\in R_{p_i}\) for every prime factor, there is a unique residue modulo \(n\) satisfying

$$x\equiv r_i\pmod{p_i}\qquad(i=1,\dots,k).$$

The implementation combines congruences two at a time. If we already know

$$x\equiv a_1\pmod{m_1},\qquad x\equiv a_2\pmod{m_2},$$

with \(\gcd(m_1,m_2)=1\), then the merged solution is

$$x=a_1+m_1\left((a_2-a_1)m_1^{-1}\bmod m_2\right).$$

This is exactly the formula implemented in crt_pair.

5. Why Enumeration Is Tiny

The default number \(n\) has 14 distinct prime factors. Among them, exactly six primes are \(1\pmod3\):

$$7,13,19,31,37,43.$$

Those contribute three local roots each. Every other prime contributes only one local root. Therefore the total number of global solutions is

$$3^6=729.$$

That is why a direct DFS over all CRT combinations is entirely practical.

6. Worked Checkpoint: \(n=7\)

The roots modulo \(7\) are \(\{1,2,4\}\). The trivial root \(1\) is excluded from the final sum, so the code returns

$$2+4=6.$$

This matches the checkpoint solve(7)=6.

7. Worked Checkpoint: \(n=91=7\cdot13\)

Here we combine

$$R_7=\{1,2,4\},\qquad R_{13}=\{1,3,9\}.$$

By CRT, each pair \((r_7,r_{13})\) gives exactly one solution modulo \(91\), so there are

$$3\cdot3=9$$

solutions in total. They are

$$1,\;9,\;16,\;22,\;29,\;53,\;74,\;79,\;81.$$

Excluding the trivial residue \(1\), the sum is

$$9+16+22+29+53+74+79+81=363,$$

which is exactly the checkpoint solve(91)=363.

8. Final Summation Rule

The DFS enumerates all global CRT solutions. At the leaf of the recursion, the code adds the residue only if

$$1<x<n.$$

That removes the always-present trivial solution \(x=1\) and keeps every nontrivial cube root of unity modulo \(n\).

How the Code Works

distinct_prime_factors extracts the distinct prime divisors of \(n\).

mod_pow tests local candidates by checking \(x^3\bmod p\).

crt_pair merges two congruences using an inverse computed by mod_inverse.

solve first builds roots_by_prime, then runs a DFS over all local root choices, updating the current CRT residue and modulus at each step.

The command-line interface supports --n=<value> and --skip-checkpoints.

Complexity Analysis

If the distinct prime factors are \(p_1,\dots,p_k\), then the number of DFS states is essentially

$$\prod_{i=1}^{k}\gcd(3,p_i-1).$$

Each transition performs only constant-time modular arithmetic at machine-word size, so the method is dominated by the number of local-root combinations.

Further Reading

  1. Problem page: https://projecteuler.net/problem=271
  2. Chinese Remainder Theorem: https://en.wikipedia.org/wiki/Chinese_remainder_theorem
  3. Primitive roots and roots of unity modulo primes: https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n

Problemzusammenfassung

Gesucht sind alle Restklassen \(x\) mit

$$x^3\equiv1\pmod n,$$

und anschließend die Summe aller nichttrivialen Lösungen \(1<x<n\). Der Standardwert im Code ist

$$n=13082761331670030,$$

also das quadratfreie Produkt aller Primzahlen von \(2\) bis \(43\).

Mathematischer Ansatz

1. Zerlegung nach Primfaktoren

Für quadratfreies

$$n=\prod_{i=1}^{k}p_i$$

ist

$$x^3\equiv1\pmod n$$

äquivalent zum System

$$x^3\equiv1\pmod{p_i}\qquad(i=1,\dots,k).$$

2. Wie viele Kubikwurzeln von \(1\) gibt es modulo \(p\)?

Die multiplikative Gruppe modulo einer Primzahl \(p\) hat Ordnung \(p-1\) und ist zyklisch. Daher besitzt die Gleichung

$$u^3=1$$

genau

$$\gcd(3,p-1)$$

Lösungen. Also:

1. bei \(p\equiv2\pmod3\) nur die Lösung \(1\),

2. bei \(p\equiv1\pmod3\) genau drei Lösungen.

3. Kleine lokale Beispiele

Für \(p=7\) gilt

$$R_7=\{1,2,4\},$$

und für \(p=13\)

$$R_{13}=\{1,3,9\}.$$

Bei Primzahlen wie \(5\) oder \(11\) ist \(R_p=\{1\}\).

4. Rekonstruktion per Chinesischem Restsatz

Wählt man für jedes \(p_i\) eine lokale Lösung \(r_i\in R_{p_i}\), dann gibt es genau eine globale Restklasse modulo \(n\) mit

$$x\equiv r_i\pmod{p_i}.$$

Der Code führt die Zusammenführung paarweise durch:

$$x=a_1+m_1\left((a_2-a_1)m_1^{-1}\bmod m_2\right).$$

5. Warum die Enumeration klein bleibt

Unter den Primfaktoren des Standard-\(n\) sind genau sechs Zahlen kongruent \(1\pmod3\):

$$7,13,19,31,37,43.$$

Jede davon liefert drei lokale Wurzeln, alle übrigen nur eine. Also gibt es insgesamt

$$3^6=729$$

globale Lösungen. Deshalb ist eine direkte DFS über alle CRT-Kombinationen völlig ausreichend.

6. Kontrollbeispiel \(n=7\)

Die Lösungen modulo \(7\) sind \(\{1,2,4\}\). Nach Ausschluss der trivialen Lösung \(1\) bleibt

$$2+4=6,$$

also solve(7)=6.

7. Kontrollbeispiel \(n=91=7\cdot13\)

Hier kombiniert man

$$R_7=\{1,2,4\},\qquad R_{13}=\{1,3,9\}.$$

Nach CRT entstehen \(3\cdot3=9\) Lösungen modulo \(91\):

$$1,\;9,\;16,\;22,\;29,\;53,\;74,\;79,\;81.$$

Ohne die triviale Lösung \(1\) ergibt sich

$$9+16+22+29+53+74+79+81=363,$$

genau wie im Checkpoint solve(91)=363.

8. Summenregel

Am Ende addiert die DFS nur Lösungen mit

$$1<x<n,$$

sodass der immer vorhandene triviale Würfelwurzelrest \(x=1\) ausgeschlossen bleibt.

Funktionsweise des Codes

distinct_prime_factors bestimmt die verschiedenen Primteiler von \(n\).

mod_pow testet lokale Kandidaten durch \(x^3\bmod p\).

crt_pair vereinigt zwei Kongruenzen mit einer modularen Inversen aus mod_inverse.

solve baut zuerst roots_by_prime auf und enumeriert dann per DFS alle lokalen Wurzelwahlen.

Die Kommandozeile unterstützt --n=<value> und --skip-checkpoints.

Komplexitätsanalyse

Die dominierende Zahl von Zuständen ist

$$\prod_{i=1}^{k}\gcd(3,p_i-1).$$

Jeder Übergang verwendet nur konstante modulare Wortarithmetik, also wird die Laufzeit praktisch vollständig durch die Zahl der lokalen Wurzelkombinationen bestimmt.

Weiterführende Hinweise

  1. Problem: https://projecteuler.net/problem=271
  2. Chinesischer Restsatz: https://de.wikipedia.org/wiki/Chinesischer_Restsatz
  3. Multiplikative Gruppen modulo \(n\): https://de.wikipedia.org/wiki/Multiplikative_Gruppe

Problem Özeti

Aranan kalıntılar

$$x^3\equiv1\pmod n$$

koşulunu sağlayan tüm \(x\) değerleridir; ardından trivial çözüm dışında kalan \(1<x<n\) çözümleri toplanır. Kodun varsayılan değeri

$$n=13082761331670030$$

olup \(2\)'den \(43\)'e kadar tüm asalların karekökten arınmış çarpımıdır.

Matematiksel Yaklaşım

1. Problem asallara ayrılır

\(n\) karekökten arınmışsa

$$n=\prod_{i=1}^{k}p_i$$

şeklinde yazılır ve

$$x^3\equiv1\pmod n$$

koşulu, her asal için ayrı ayrı

$$x^3\equiv1\pmod{p_i}$$

koşullarına eşdeğerdir.

2. Bir asal modunda kaç tane küp kök vardır?

Asal \(p\) için sıfır olmayan kalıntılar grubu mertebesi \(p-1\) olan çevrimsel bir gruptur. Bu grupta

$$u^3=1$$

denklemindeki çözüm sayısı tam olarak

$$\gcd(3,p-1)$$

olur. Yani:

1. \(p\equiv2\pmod3\) ise yalnızca \(1\) kökü vardır,

2. \(p\equiv1\pmod3\) ise tam 3 kök vardır.

3. Küçük yerel örnekler

\(p=7\) için kökler

$$R_7=\{1,2,4\}$$

olur. \(p=13\) için ise

$$R_{13}=\{1,3,9\}.$$

\(5\), \(11\), \(17\) gibi \(2\pmod3\) olan asal modlarda kök kümesi yalnızca \(\{1\}\)'dir.

4. CRT ile global çözüm kurma

Her asal için bir yerel kök \(r_i\in R_{p_i}\) seçilirse,

$$x\equiv r_i\pmod{p_i}$$

sistemini sağlayan tek bir global kalıntı sınıfı vardır. Kod bunu ikili CRT birleştirmeleriyle yapar:

$$x=a_1+m_1\left((a_2-a_1)m_1^{-1}\bmod m_2\right).$$

5. Neden tüm kombinasyonları gezmek ucuz?

Varsayılan \(n\)'nin asal çarpanları arasında yalnızca şu altı asal \(1\pmod3\)'tür:

$$7,13,19,31,37,43.$$

Bunların her biri 3 yerel kök verir; diğer bütün asallar yalnızca 1 kök verir. Dolayısıyla toplam global çözüm sayısı

$$3^6=729$$

kadardır. Bu yüzden DFS ile bütün CRT kombinasyonlarını doğrudan gezmek yeterince küçüktür.

6. Çalışan checkpoint: \(n=7\)

\(7\) modundaki çözümler \(\{1,2,4\}\) olduğundan, trivial kök \(1\) çıkarılınca toplam

$$2+4=6$$

olur. Bu da solve(7)=6 kontrolüne karşılık gelir.

7. Çalışan checkpoint: \(n=91=7\cdot13\)

Burada

$$R_7=\{1,2,4\},\qquad R_{13}=\{1,3,9\}$$

kümeleri CRT ile birleştirilir. Böylece toplam

$$3\cdot3=9$$

çözüm gelir. Bunlar

$$1,\;9,\;16,\;22,\;29,\;53,\;74,\;79,\;81$$

şeklindedir. Trivial çözüm \(1\) çıkarılınca

$$9+16+22+29+53+74+79+81=363$$

elde edilir; bu da kodun solve(91)=363 checkpoint'idir.

8. Nihai toplama kuralı

DFS tüm CRT çözümlerini üretir; yaprakta yalnızca

$$1<x<n$$

koşulunu sağlayan kalıntılar toplama eklenir. Böylece her zaman var olan trivial kök \(x=1\) hariç tutulur.

Kodun Çalışma Mantığı

distinct_prime_factors, \(n\)'nin farklı asal bölenlerini çıkarır.

mod_pow, yerel adayların \(x^3\equiv1\pmod p\) koşulunu test eder.

crt_pair, mod_inverse kullanarak iki kongruansı tek bir kongruansta birleştirir.

solve önce her asal için kök listesini kurar, ardından DFS ile tüm yerel seçim kombinasyonlarını dolaşır.

Komut satırı seçenekleri: --n=<value> ve --skip-checkpoints.

Karmaşıklık Analizi

Esas durum sayısı

$$\prod_{i=1}^{k}\gcd(3,p_i-1)$$

ile belirlenir. Her geçiş sabit sayıda modüler işlem içerdiği için toplam maliyet neredeyse tamamen yerel kök kombinasyonlarının sayısından gelir.

İleri Okuma

  1. Problem metni: https://projecteuler.net/problem=271
  2. Çin Kalan Teoremi: https://tr.wikipedia.org/wiki/Çin_kalan_teoremi
  3. Modüler çarpma grupları: https://tr.wikipedia.org/wiki/Modüler_aritmetik

Resumen del Problema

Buscamos todas las clases residuales que satisfacen

$$x^3\equiv1\pmod n,$$

y luego sumamos solo las soluciones no triviales, es decir, las que cumplen \(1<x<n\). El valor por defecto del código es

$$n=13082761331670030,$$

producto libre de cuadrados de todos los primos entre \(2\) y \(43\).

Enfoque Matemático

1. Descomposición prima a prima

Si

$$n=\prod_{i=1}^{k}p_i$$

es libre de cuadrados, entonces

$$x^3\equiv1\pmod n$$

equivale al sistema

$$x^3\equiv1\pmod{p_i}\qquad(i=1,\dots,k).$$

2. ¿Cuántas raíces cúbicas de la unidad hay módulo un primo?

El grupo multiplicativo módulo un primo \(p\) tiene orden \(p-1\) y es cíclico. Por tanto, la ecuación

$$u^3=1$$

tiene exactamente

$$\gcd(3,p-1)$$

soluciones. Así:

1. si \(p\equiv2\pmod3\), solo aparece la raíz \(1\),

2. si \(p\equiv1\pmod3\), aparecen tres raíces.

3. Ejemplos locales pequeños

Para \(p=7\),

$$R_7=\{1,2,4\},$$

y para \(p=13\),

$$R_{13}=\{1,3,9\}.$$

En primos como \(5\) o \(11\), que son \(2\pmod3\), solo queda \(\{1\}\).

4. Reconstrucción por CRT

Si elegimos una raíz local \(r_i\in R_{p_i}\) para cada primo, existe una única clase residual global que cumple

$$x\equiv r_i\pmod{p_i}.$$

El programa combina congruencias de dos en dos usando

$$x=a_1+m_1\left((a_2-a_1)m_1^{-1}\bmod m_2\right).$$

5. Por qué la enumeración es pequeña

En el \(n\) por defecto, exactamente seis primos son \(1\pmod3\):

$$7,13,19,31,37,43.$$

Cada uno aporta tres raíces locales; todos los demás aportan una sola. Por tanto, el número total de soluciones globales es

$$3^6=729.$$

6. Checkpoint trabajado: \(n=7\)

Las soluciones módulo \(7\) son \(\{1,2,4\}\). Al excluir la trivial \(1\), queda

$$2+4=6,$$

que coincide con solve(7)=6.

7. Checkpoint trabajado: \(n=91=7\cdot13\)

Aquí se combinan

$$R_7=\{1,2,4\},\qquad R_{13}=\{1,3,9\}.$$

Por CRT aparecen \(3\cdot3=9\) soluciones:

$$1,\;9,\;16,\;22,\;29,\;53,\;74,\;79,\;81.$$

Sin la solución trivial \(1\), la suma es

$$9+16+22+29+53+74+79+81=363,$$

exactamente el valor del checkpoint solve(91)=363.

8. Regla final de suma

La DFS enumera todas las soluciones CRT y solo añade las que satisfacen

$$1<x<n.$$

Así se elimina la raíz trivial \(x=1\), que siempre existe.

Cómo funciona el código

distinct_prime_factors obtiene los factores primos distintos de \(n\).

mod_pow prueba los candidatos locales comprobando \(x^3\bmod p\).

crt_pair une dos congruencias con una inversa modular calculada por mod_inverse.

solve construye primero roots_by_prime y después recorre por DFS todas las elecciones locales.

La interfaz acepta --n=<value> y --skip-checkpoints.

Complejidad

El número dominante de estados es

$$\prod_{i=1}^{k}\gcd(3,p_i-1).$$

Cada transición requiere solo aritmética modular de costo constante, así que el trabajo total está dominado por el número de combinaciones de raíces locales.

Lecturas

  1. Problema: https://projecteuler.net/problem=271
  2. Teorema chino del resto: https://es.wikipedia.org/wiki/Teorema_chino_del_resto
  3. Grupos multiplicativos modulares: https://es.wikipedia.org/wiki/Aritmética_modular

问题概述

我们要求出所有满足

$$x^3\equiv1\pmod n$$

的剩余类,然后把所有非平凡解,也就是 \(1<x<n\) 的那些解加起来。代码默认使用的

$$n=13082761331670030$$

是从 \(2\) 到 \(43\) 的全部素数的平方自由乘积。

数学方法

1. 先按素因子拆开

因为 \(n\) 是平方自由的,所以可以写成

$$n=\prod_{i=1}^{k}p_i.$$

于是

$$x^3\equiv1\pmod n$$

等价于同时满足

$$x^3\equiv1\pmod{p_i}\qquad(i=1,\dots,k).$$

2. 模素数时有多少个三次单位根?

模素数 \(p\) 的非零剩余构成一个阶为 \(p-1\) 的循环群。因此方程

$$u^3=1$$

恰好有

$$\gcd(3,p-1)$$

个解。于是:

1. 若 \(p\equiv2\pmod3\),则只有根 \(1\),

2. 若 \(p\equiv1\pmod3\),则有三个根。

3. 小型局部例子

对 \(p=7\),根集合是

$$R_7=\{1,2,4\},$$

对 \(p=13\),根集合是

$$R_{13}=\{1,3,9\}.$$

像 \(5,11,17\) 这类 \(2\pmod3\) 的素数,局部根集合就只有 \(\{1\}\)。

4. 用中国剩余定理拼回全局解

一旦为每个素因子选定一个局部根 \(r_i\in R_{p_i}\),就唯一确定了一个模 \(n\) 的全局剩余类:

$$x\equiv r_i\pmod{p_i}.$$

程序按两个同余式一组地合并,公式是

$$x=a_1+m_1\left((a_2-a_1)m_1^{-1}\bmod m_2\right).$$

5. 为什么枚举规模很小

在默认的 \(n\) 中,只有下面六个素数满足 \(1\pmod3\):

$$7,13,19,31,37,43.$$

它们各自贡献三个局部根,其余素数都只贡献一个局部根。因此全局解总数就是

$$3^6=729.$$

这就是为什么代码直接 DFS 枚举所有 CRT 组合也完全可行。

6. 详细 checkpoint:\(n=7\)

模 \(7\) 的解是 \(\{1,2,4\}\)。去掉平凡解 \(1\) 后,剩余和为

$$2+4=6,$$

这正是检查值 solve(7)=6

7. 详细 checkpoint:\(n=91=7\cdot13\)

这里组合的是

$$R_7=\{1,2,4\},\qquad R_{13}=\{1,3,9\}.$$

由 CRT 可知一共有

$$3\cdot3=9$$

个解,它们是

$$1,\;9,\;16,\;22,\;29,\;53,\;74,\;79,\;81.$$

去掉平凡解 \(1\) 后,和为

$$9+16+22+29+53+74+79+81=363,$$

正好对应代码里的 solve(91)=363

8. 最后的求和规则

DFS 枚举所有 CRT 组合,在递归叶子处只把满足

$$1<x<n$$

的解加入总和。这样就自动排除了始终存在的平凡根 \(x=1\)。

代码如何工作

distinct_prime_factors 提取 \(n\) 的不同素因子。

mod_pow 检查局部候选是否满足 \(x^3\equiv1\pmod p\)。

crt_pair 借助 mod_inverse 把两个同余式合并成一个。

solve 先构造 roots_by_prime,然后用 DFS 遍历所有局部根的选择。

命令行支持 --n=<value>--skip-checkpoints

复杂度分析

主导状态数为

$$\prod_{i=1}^{k}\gcd(3,p_i-1).$$

每一步只做常数次机器字长的模运算,所以总成本基本由局部根组合数决定。

延伸阅读

  1. 题目页面: https://projecteuler.net/problem=271
  2. 中国剩余定理: https://zh.wikipedia.org/wiki/中国剩余定理
  3. 模乘法群: https://zh.wikipedia.org/wiki/模算术

Краткое описание

Нужно найти все вычеты, удовлетворяющие

$$x^3\equiv1\pmod n,$$

а затем просуммировать только нетривиальные решения \(1<x<n\). Значение по умолчанию в программе:

$$n=13082761331670030,$$

то есть квадратсвободное произведение всех простых от \(2\) до \(43\).

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

1. Разложение по простым множителям

Если

$$n=\prod_{i=1}^{k}p_i,$$

то условие

$$x^3\equiv1\pmod n$$

равносильно системе

$$x^3\equiv1\pmod{p_i}\qquad(i=1,\dots,k).$$

2. Сколько кубических корней единицы по модулю простого?

Мультипликативная группа по модулю простого \(p\) имеет порядок \(p-1\) и является циклической. Поэтому уравнение

$$u^3=1$$

имеет ровно

$$\gcd(3,p-1)$$

решений. Значит:

1. при \(p\equiv2\pmod3\) существует только корень \(1\),

2. при \(p\equiv1\pmod3\) существует три корня.

3. Малые локальные примеры

Для \(p=7\)

$$R_7=\{1,2,4\},$$

а для \(p=13\)

$$R_{13}=\{1,3,9\}.$$

Для простых вроде \(5\) и \(11\) множество решений равно просто \(\{1\}\).

4. Склейка по китайской теореме об остатках

Если для каждого \(p_i\) выбрано локальное решение \(r_i\in R_{p_i}\), то существует единственный глобальный вычет modulo \(n\), удовлетворяющий

$$x\equiv r_i\pmod{p_i}.$$

Код склеивает сравнения попарно по формуле

$$x=a_1+m_1\left((a_2-a_1)m_1^{-1}\bmod m_2\right).$$

5. Почему полный перебор здесь маленький

Среди простых делителей стандартного \(n\) только шесть чисел сравнимы с \(1\pmod3\):

$$7,13,19,31,37,43.$$

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

$$3^6=729.$$

6. Контрольный пример \(n=7\)

Решения modulo \(7\): \(\{1,2,4\}\). После удаления тривиального корня \(1\) остаётся

$$2+4=6,$$

что совпадает с проверкой solve(7)=6.

7. Контрольный пример \(n=91=7\cdot13\)

Здесь комбинируются множества

$$R_7=\{1,2,4\},\qquad R_{13}=\{1,3,9\}.$$

По CRT возникает \(3\cdot3=9\) решений:

$$1,\;9,\;16,\;22,\;29,\;53,\;74,\;79,\;81.$$

Если убрать тривиальное \(1\), получаем

$$9+16+22+29+53+74+79+81=363,$$

то есть ровно значение checkpoint-а solve(91)=363.

8. Правило суммирования

В конце DFS добавляет только те вычеты, для которых

$$1<x<n.$$

Тем самым автоматически исключается всегда существующий тривиальный корень \(x=1\).

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

distinct_prime_factors находит различные простые делители числа \(n\).

mod_pow проверяет локальных кандидатов условием \(x^3\equiv1\pmod p\).

crt_pair объединяет два сравнения при помощи обратного элемента из mod_inverse.

solve сначала строит roots_by_prime, затем выполняет DFS по всем локальным выборам.

Поддерживаются параметры --n=<value> и --skip-checkpoints.

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

Главное число состояний равно

$$\prod_{i=1}^{k}\gcd(3,p_i-1).$$

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

Дополнительные материалы

  1. Условие: https://projecteuler.net/problem=271
  2. Китайская теорема об остатках: https://ru.wikipedia.org/wiki/Китайская_теорема_об_остатках
  3. Мультипликативные группы по модулю: https://ru.wikipedia.org/wiki/Модулярная_арифметика

ملخص المسألة

نريد جميع البواقي التي تحقق

$$x^3\equiv1\pmod n,$$

ثم نجمع الحلول غير البديهية فقط، أي تلك التي تحقق \(1<x<n\). القيمة الافتراضية في الكود هي

$$n=13082761331670030,$$

وهي حاصل ضرب خالٍ من المربعات لجميع الأعداد الأولية من \(2\) حتى \(43\).

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

1. تفكيك المسألة على العوامل الأولية

بما أن

$$n=\prod_{i=1}^{k}p_i$$

خالية من التكرار، فإن

$$x^3\equiv1\pmod n$$

تكافئ النظام

$$x^3\equiv1\pmod{p_i}\qquad(i=1,\dots,k).$$

2. كم عدد الجذور التكعيبية للوحدة modulo عدد أولي؟

المجموعة الضربية modulo عدد أولي \(p\) رتبتها \(p-1\) وهي دورية. لذلك فإن المعادلة

$$u^3=1$$

تملك بالضبط

$$\gcd(3,p-1)$$

حلولًا. ومن ثم:

1. إذا كان \(p\equiv2\pmod3\) فالحل الوحيد هو \(1\)،

2. إذا كان \(p\equiv1\pmod3\) فهناك ثلاثة حلول.

3. أمثلة محلية صغيرة

عند \(p=7\) نحصل على

$$R_7=\{1,2,4\},$$

وعند \(p=13\) نحصل على

$$R_{13}=\{1,3,9\}.$$

أما في أوليات مثل \(5\) و\(11\) فمجموعة الجذور هي فقط \(\{1\}\).

4. إعادة التركيب بنظرية البواقي الصينية

إذا اخترنا جذرًا محليًا \(r_i\in R_{p_i}\) لكل عامل أولي، فهناك باقٍ وحيد modulo \(n\) يحقق

$$x\equiv r_i\pmod{p_i}.$$

ويتم دمج معادلتين في كل خطوة عبر الصيغة

$$x=a_1+m_1\left((a_2-a_1)m_1^{-1}\bmod m_2\right).$$

5. لماذا يبقى التعداد صغيرًا؟

في قيمة \(n\) الافتراضية، لا يوجد سوى ستة أوليات تحقق \(1\pmod3\):

$$7,13,19,31,37,43.$$

كل واحد منها يعطي ثلاثة جذور محلية، بينما تعطي بقية الأوليات جذرًا واحدًا فقط. لذلك يكون عدد الحلول العالمية

$$3^6=729.$$

وهذا ما يجعل DFS المباشرة على جميع تراكيب CRT عملية جدًا.

6. مثال تحقق: \(n=7\)

الحلول modulo \(7\) هي \(\{1,2,4\}\). وبعد حذف الحل البديهي \(1\) يبقى

$$2+4=6,$$

وهو بالضبط ما يطابق التحقق solve(7)=6.

7. مثال تحقق: \(n=91=7\cdot13\)

هنا نجمع بين

$$R_7=\{1,2,4\},\qquad R_{13}=\{1,3,9\}.$$

وبحسب CRT نحصل على

$$3\cdot3=9$$

حلول modulo \(91\)، وهي

$$1,\;9,\;16,\;22,\;29,\;53,\;74,\;79,\;81.$$

وباستبعاد الحل البديهي \(1\) يكون المجموع

$$9+16+22+29+53+74+79+81=363,$$

وهو تمامًا قيمة checkpoint في الكود: solve(91)=363.

8. قاعدة الجمع النهائية

في نهاية DFS يضيف البرنامج فقط البواقي التي تحقق

$$1<x<n.$$

وهكذا يستبعد الجذر البديهي \(x=1\) الذي يوجد دائمًا.

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

distinct_prime_factors يستخرج العوامل الأولية المختلفة لـ \(n\).

mod_pow يفحص المرشحين المحليين بشرط \(x^3\equiv1\pmod p\).

crt_pair يدمج معادلتين باستعمال معكوس معياري تحسبه الدالة mod_inverse.

solve يبني أولًا roots_by_prime ثم يمر DFS على جميع الاختيارات المحلية.

تقبل الواجهة الوسيطين --n=<value> و--skip-checkpoints.

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

عدد الحالات الأساسي يساوي

$$\prod_{i=1}^{k}\gcd(3,p_i-1).$$

ولأن كل انتقال يتطلب فقط عددًا ثابتًا من العمليات المعيارية، فإن الكلفة الكلية تهيمن عليها تراكيب الجذور المحلية.

مراجع إضافية

  1. صفحة المسألة: https://projecteuler.net/problem=271
  2. نظرية البواقي الصينية: https://ar.wikipedia.org/wiki/نظرية_البواقي_الصينية
  3. الحساب المعياري: https://ar.wikipedia.org/wiki/حساب_تطابقي