Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .github/workflows/mckay-conjecture-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: McKay Conjecture CI

on:
push:
paths:
- 'mckay-conjecture/**'
- '.github/workflows/mckay-conjecture-ci.yml'
pull_request:
paths:
- 'mckay-conjecture/**'
- '.github/workflows/mckay-conjecture-ci.yml'
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v5
- uses: leanprover/lean-action@v1
with:
lake-package-directory: mckay-conjecture
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ This repository hosts two completed formalization projects. Each is a self-conta
| **Paper** | [arXiv:2603.15929](https://arxiv.org/abs/2603.15929) · [HF paper](https://huggingface.co/papers/2603.15929) | [Technical report](grothendieck-vanishing/TECHNICAL_REPORT_GV.md) |
| **Read more** | [README](landau/README.md) · [Technical report](landau/TECHNICAL_REPORT.md) · [Blueprint](https://vilin97.github.io/Clawristotle/landau/blueprint/) | [README](grothendieck-vanishing/README.md) · [Brian's review](grothendieck-vanishing/review.md) · [Blueprint](https://vilin97.github.io/Clawristotle/grothendieck-vanishing/blueprint/) |

An additional project, [`mckay-conjecture/`](mckay-conjecture/), is in active
development. Its first milestone is a compiled, adversarially audited Lean
statement of the McKay conjecture for ordinary irreducible complex characters.

## How it works

The human steers — choosing the theorem, fixing the definitions, auditing the final statement — while AI agents handle the implementation: writing the Lean code, searching for proofs, dispatching hard lemmas to the [Aristotle](https://aristotle.harmonic.fun/) cloud prover, and reviewing their own output in autonomous critique–plan–prove–simplify loops. Each project's README describes its agent stack and how the method evolved between the two projects.
Expand Down
10 changes: 10 additions & 0 deletions mckay-conjecture/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/.lake/
*.olean
*.ilean
*.log
*.aux
*.fdb_latexmk
*.fls
*.out
*.pdf
*.synctex.gz
1 change: 1 addition & 0 deletions mckay-conjecture/McKayConjecture.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import McKayConjecture.Statement
80 changes: 80 additions & 0 deletions mckay-conjecture/McKayConjecture/IrreducibleCharacter.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/-
Copyright (c) 2026 Clawristotle contributors. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Clawristotle contributors
-/
import Mathlib.Data.Complex.Basic
import Mathlib.RepresentationTheory.Character

/-!
# Ordinary irreducible complex characters

This file packages an ordinary irreducible complex character together with its
(natural-number-valued) degree. The witness field ensures that the values and
degree come from one simple finite-dimensional complex representation.
-/

noncomputable section

open CategoryTheory

universe u

namespace McKayConjecture

variable (G : Type u) [Group G]

/-- An ordinary irreducible complex character of `G`.

Equality is equality of the character values and degree, rather than equality
of a chosen representation. Thus isomorphic representations, and more
generally any representations with the same character, determine the same
element of this type.
-/
structure IrreducibleCharacter where
/-- The values of the character on elements of the group. -/
values : G → ℂ
/-- The character degree, equivalently the dimension of a realizing representation. -/
degree : ℕ
/-- A simple finite-dimensional complex representation realizing the data. -/
isIrreducible :
∃ V : FDRep ℂ G,
Simple V ∧
V.character = values ∧
Module.finrank ℂ V = degree

namespace IrreducibleCharacter

variable {G}

/-- Evaluating an irreducible character at the identity gives its degree. -/
@[simp]
theorem value_one (χ : IrreducibleCharacter G) : χ.values 1 = (χ.degree : ℂ) := by
obtain ⟨V, _, hvalues, hdegree⟩ := χ.isIrreducible
rw [← hvalues, FDRep.char_one, hdegree]

/-- The character values determine the certified degree. -/
theorem degree_eq_of_values_eq {χ ψ : IrreducibleCharacter G}
(hvalues : χ.values = ψ.values) : χ.degree = ψ.degree := by
apply Nat.cast_injective (R := ℂ)
rw [← χ.value_one, ← ψ.value_one, hvalues]

/-- Irreducible characters are equal when their character functions are equal. -/
@[ext]
theorem ext {χ ψ : IrreducibleCharacter G} (hvalues : χ.values = ψ.values) : χ = ψ := by
have hdegree := degree_eq_of_values_eq hvalues
cases χ
cases ψ
simp_all

/-- An irreducible character has `p'`-degree when `p` does not divide its degree. -/
def IsPPrimeDegree (p : ℕ) (χ : IrreducibleCharacter G) : Prop :=
¬p ∣ χ.degree

end IrreducibleCharacter

/-- The type denoted `Irr_{p'}(G)` in the McKay conjecture. -/
def PPrimeIrreducibleCharacter (p : ℕ) :=
{χ : IrreducibleCharacter G // χ.IsPPrimeDegree p}

end McKayConjecture
40 changes: 40 additions & 0 deletions mckay-conjecture/McKayConjecture/Statement.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/-
Copyright (c) 2026 Clawristotle contributors. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Clawristotle contributors
-/
import Mathlib.GroupTheory.Sylow
import McKayConjecture.IrreducibleCharacter

/-!
# The McKay conjecture

This file states the McKay conjecture for ordinary irreducible complex
characters. The cardinal equality is used directly, so its meaning does not
silently collapse to `0 = 0` if a finiteness instance has not yet been built.
-/

noncomputable section

universe u

namespace McKayConjecture

variable {G : Type u} [Group G]

/-- The normalizer `N_G(P)` of a Sylow subgroup, regarded as a group in its own right. -/
abbrev SylowNormalizer {p : ℕ} (P : Sylow p G) : Type u :=
Subgroup.normalizer (P : Set G)

/-- The statement of the McKay conjecture for a finite group `G`, a prime `p`,
and a Sylow `p`-subgroup `P`.

It asserts that the irreducible complex characters of `G` whose degrees are
not divisible by `p` and those of `N_G(P)` have the same cardinality.
-/
def Statement (G : Type u) [Finite G] [Group G] (p : ℕ) [Fact p.Prime]
(P : Sylow p G) : Prop :=
Cardinal.mk (PPrimeIrreducibleCharacter G p) =
Cardinal.mk (PPrimeIrreducibleCharacter (SylowNormalizer P) p)

end McKayConjecture
33 changes: 33 additions & 0 deletions mckay-conjecture/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# The McKay Conjecture

This Lean 4 package formalizes the statement of the McKay conjecture for
ordinary irreducible complex characters.

For a finite group `G`, a prime `p`, and a Sylow `p`-subgroup `P`, let
`Irr_{p'}(G)` be the irreducible complex characters of `G` whose degrees are not
divisible by `p`. The conjecture asserts

```text
|Irr_{p'}(G)| = |Irr_{p'}(N_G(P))|.
```

The package is pinned to mathlib commit
`9cebae57f419f984d008f357605b2621a1d9f13b` (Lean `v4.33.0-rc1`), which was the
tip of mathlib's `master` branch when the project was created on 2026-07-25.

## Layout

- `McKayConjecture/IrreducibleCharacter.lean` defines ordinary irreducible
complex characters and the `p'`-degree condition.
- `McKayConjecture/Statement.lean` defines the Sylow normalizer and the
proposition `McKayConjecture.Statement`.

## Build

```bash
lake exe cache get
lake build
```

The first milestone contains only the audited proposition; it does not assume
the conjecture as an axiom or hide an unfinished proof behind `sorry`.
96 changes: 96 additions & 0 deletions mckay-conjecture/lake-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
{"version": "1.2.0",
"packagesDir": ".lake/packages",
"packages":
[{"url": "https://github.com/leanprover-community/mathlib4",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "9cebae57f419f984d008f357605b2621a1d9f13b",
"name": "mathlib",
"manifestFile": "lake-manifest.json",
"inputRev": "9cebae57f419f984d008f357605b2621a1d9f13b",
"inherited": false,
"configFile": "lakefile.lean"},
{"url": "https://github.com/leanprover-community/plausible",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "b1c4a69a7e247ab7df20460212001673d74f08c0",
"name": "plausible",
"manifestFile": "lake-manifest.json",
"inputRev": "main",
"inherited": true,
"configFile": "lakefile.toml"},
{"url": "https://github.com/leanprover-community/LeanSearchClient",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "0498c7c070c143a3bf7379f4d99a2c63bb9d9715",
"name": "LeanSearchClient",
"manifestFile": "lake-manifest.json",
"inputRev": "main",
"inherited": true,
"configFile": "lakefile.toml"},
{"url": "https://github.com/leanprover-community/import-graph",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "18a90119a5d316358fde6c86e0ca24e59212e32c",
"name": "importGraph",
"manifestFile": "lake-manifest.json",
"inputRev": "main",
"inherited": true,
"configFile": "lakefile.toml"},
{"url": "https://github.com/leanprover-community/ProofWidgets4",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "b1436dc749e722c9920036b52cdc43b3451d0b69",
"name": "proofwidgets",
"manifestFile": "lake-manifest.json",
"inputRev": "main",
"inherited": true,
"configFile": "lakefile.lean"},
{"url": "https://github.com/leanprover-community/aesop",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "57d3325be72a842920813bcb40f96a6f7393c185",
"name": "aesop",
"manifestFile": "lake-manifest.json",
"inputRev": "master",
"inherited": true,
"configFile": "lakefile.toml"},
{"url": "https://github.com/leanprover-community/quote4",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "ee41917ae11d38479fb8fb24745f7ca4bf0a784d",
"name": "Qq",
"manifestFile": "lake-manifest.json",
"inputRev": "master",
"inherited": true,
"configFile": "lakefile.toml"},
{"url": "https://github.com/leanprover-community/batteries",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "d60e6444e6fd881dfa077ff36e96de75753afa28",
"name": "batteries",
"manifestFile": "lake-manifest.json",
"inputRev": "main",
"inherited": true,
"configFile": "lakefile.toml"},
{"url": "https://github.com/leanprover/lean4-cli",
"type": "git",
"subDir": null,
"scope": "leanprover",
"rev": "da07ca808b6718cb2aed14dba154e5a08b8f8ecf",
"name": "Cli",
"manifestFile": "lake-manifest.json",
"inputRev": "v4.33.0-rc1",
"inherited": true,
"configFile": "lakefile.toml"}],
"name": "«mckay-conjecture»",
"lakeDir": ".lake",
"fixedToolchain": false}
16 changes: 16 additions & 0 deletions mckay-conjecture/lakefile.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name = "mckay-conjecture"
version = "0.1.0"
defaultTargets = ["McKayConjecture"]

[leanOptions]
pp.unicode.fun = true
relaxedAutoImplicit = false
weak.linter.mathlibStandardSet = true

[[require]]
name = "mathlib"
scope = "leanprover-community"
rev = "9cebae57f419f984d008f357605b2621a1d9f13b"

[[lean_lib]]
name = "McKayConjecture"
1 change: 1 addition & 0 deletions mckay-conjecture/lean-toolchain
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
leanprover/lean4:v4.33.0-rc1
Loading