Asi ramanujan-expander
Ramanujan graphs and Alon-Boppana spectral optimality for edge growth rules. Optimal expanders with λ₂ ≤ 2√(d-1) bound.
install
source · Clone the upstream repo
git clone https://github.com/plurigrid/asi
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/plurigrid/asi "$T" && mkdir -p ~/.claude/skills && cp -r "$T/ies/music-topos/.ruler/skills/ramanujan-expander" ~/.claude/skills/plurigrid-asi-ramanujan-expander-e96e63 && rm -rf "$T"
manifest:
ies/music-topos/.ruler/skills/ramanujan-expander/SKILL.mdsource content
Ramanujan Expander Skill
"The Alon-Boppana bound is unbreakable. You cannot create a d-regular graph with λ₂ < 2√(d-1), even theoretically."
Overview
Ramanujan graphs are optimal spectral expanders - they achieve the theoretical limit on eigenvalue separation. This skill provides:
- Alon-Boppana bound verification - Prove your graph is optimal
- Edge growth rules - Add edges while preserving Ramanujan property
- Centrality validity predicates - Spectral methods for node importance
- Mixing time bounds - O(log n) mixing from spectral gap
The Alon-Boppana Bound
Theorem (Alon-Boppana)
For any d-regular graph G on n vertices:
λ₂(G) ≥ 2√(d-1) - o(1) as n → ∞
where λ₂ is the second-largest eigenvalue of the adjacency matrix.
Ramanujan Property
A d-regular graph G is Ramanujan if:
|λ| ≤ 2√(d-1) for all eigenvalues λ ≠ ±d
This is the tightest possible spectral gap.
Example: 4-Regular Graphs
d = 4 2√(d-1) = 2√3 ≈ 3.464 Maximum spectral gap = d - 2√(d-1) = 4 - 3.464 = 0.536 Your observed gap: ~0.54 ✓ (theoretically optimal)
Edge Growth Rules
Rule 1: Preserve Regularity
function add_edge_preserving_regularity!(G, u, v) # Adding (u,v) increases degree of u and v by 1 # Must remove another edge to maintain d-regularity # Find edge (u, w) where w ≠ v w = find_neighbor(G, u, exclude=v) # Find edge (v, x) where x ≠ u x = find_neighbor(G, v, exclude=u) # Remove old edges remove_edge!(G, u, w) remove_edge!(G, v, x) # Add new edges (2-switch) add_edge!(G, u, v) add_edge!(G, w, x) # Verify Ramanujan property preserved @assert is_ramanujan(G) end
Rule 2: Spectral Monotonicity
function grow_edge_spectral_monotonic!(G, candidates) """ Add edge that minimizes λ₂ increase. Greedy heuristic for Ramanujan preservation. """ best_edge = nothing best_λ₂ = Inf current_λ₂ = second_eigenvalue(G) for (u, v) in candidates G_test = copy(G) add_edge!(G_test, u, v) new_λ₂ = second_eigenvalue(G_test) if new_λ₂ < best_λ₂ best_λ₂ = new_λ₂ best_edge = (u, v) end end if best_λ₂ ≤ 2√(degree(G) - 1) add_edge!(G, best_edge...) return true end return false # No valid edge preserves Ramanujan end
Rule 3: LPS Construction (Lubotzky-Phillips-Sarnak)
function lps_ramanujan_graph(p, q) """ Construct (p+1)-regular Ramanujan graph on ~q³ vertices. Requirements: - p, q distinct odd primes - p ≡ q ≡ 1 (mod 4) - p is quadratic residue mod q """ @assert is_prime(p) && is_prime(q) @assert p % 4 == 1 && q % 4 == 1 @assert is_quadratic_residue(p, q) # Cayley graph of PSL(2, ℤ_q) with generators from quaternions G = cayley_graph_psl2(q, lps_generators(p)) # Guaranteed Ramanujan by Deligne's proof of Ramanujan conjecture @assert second_eigenvalue(G) ≤ 2√p return G end
Centrality Validity Predicates
Spectral Centrality
function spectral_centrality(G) """ Centrality based on principal eigenvector. For Ramanujan graphs, this converges in O(log n) iterations. """ A = adjacency_matrix(G) λ, v = eigen(A) # Principal eigenvector (λ₁ = d) principal = v[:, argmax(λ)] # Normalize to probability distribution return abs.(principal) ./ sum(abs.(principal)) end
Validity Predicate: Centrality Consistency
function centrality_validity_predicate(G, node, threshold=0.01) """ A node's centrality is valid if: 1. It's within spectral gap bounds 2. It satisfies local-global consistency """ c = spectral_centrality(G) d = degree(G) # Bound from Ramanujan property spectral_bound = 2√(d-1) / d # Local contribution local_c = sum(c[neighbors(G, node)]) / d # Validity: local ≈ global (up to spectral gap) return abs(c[node] - local_c) ≤ spectral_bound + threshold end
Non-Backtracking Centrality
function non_backtracking_centrality(G) """ Use non-backtracking matrix B for centrality. More robust than adjacency-based methods. Reference: Krzakala et al. "Spectral redemption" """ B = non_backtracking_matrix(G) λ, v = eigen(B) # Second eigenvector gives community structure v2 = v[:, sortperm(abs.(λ), rev=true)[2]] # Project back to vertices return project_to_vertices(G, v2) end
Mixing Time from Spectral Gap
Theorem
For a d-regular Ramanujan graph:
t_mix = O(log n / log(d / 2√(d-1)))
Implementation
function mixing_time_bound(G) d = degree(G) n = nv(G) λ₂ = second_eigenvalue(G) # Spectral gap gap = d - λ₂ # Mixing time (theoretical bound) t_mix = log(n) / log(d / λ₂) # For Ramanujan: gap ≥ d - 2√(d-1) ramanujan_gap = d - 2√(d-1) return ( gap = gap, mixing_time = t_mix, is_optimal = gap ≥ ramanujan_gap - 0.01 ) end
GF(3) Integration
Trit Assignment
| Component | Trit | Role |
|---|---|---|
| ramanujan-expander | -1 | Validator - verifies spectral bounds |
| ihara-zeta | 0 | Coordinator - non-backtracking walks |
| moebius-inversion | +1 | Generator - produces alternating sums |
Conservation: (-1) + (0) + (+1) = 0 ✓
Spectral Bundle Triads
ramanujan-expander (-1) ⊗ ihara-zeta (0) ⊗ moebius-inversion (+1) = 0 ✓ [Spectral] ramanujan-expander (-1) ⊗ acsets (0) ⊗ gay-mcp (+1) = 0 ✓ [Graph Coloring] ramanujan-expander (-1) ⊗ influence-propagation (0) ⊗ agent-o-rama (+1) = 0 ✓ [Centrality]
DuckDB Schema
CREATE TABLE ramanujan_graphs ( graph_id VARCHAR PRIMARY KEY, n_vertices INT, degree INT, spectral_gap FLOAT, lambda_2 FLOAT, is_ramanujan BOOLEAN, construction VARCHAR, -- 'lps', 'margulis', 'random' seed BIGINT ); CREATE TABLE edge_growth_log ( step_id VARCHAR PRIMARY KEY, graph_id VARCHAR, edge_added VARCHAR, -- 'u-v' lambda_2_before FLOAT, lambda_2_after FLOAT, ramanujan_preserved BOOLEAN, timestamp TIMESTAMP ); CREATE TABLE centrality_snapshots ( snapshot_id VARCHAR PRIMARY KEY, graph_id VARCHAR, vertex_id INT, spectral_centrality FLOAT, nonbacktracking_centrality FLOAT, validity_predicate BOOLEAN, computed_at TIMESTAMP );
Literature
Primary Sources
- Alon, N. (1986) - "Eigenvalues and Expanders"
- Lubotzky, Phillips, Sarnak (1988) - "Ramanujan Graphs" (LPS construction)
- Margulis (1988) - Alternative Ramanujan construction
- Nilli (1991) - Alon-Boppana bound proof
- Bordenave, Lelarge, Massoulié (2015) - Non-backtracking spectral clustering
Key Results
| Result | Bound | Reference |
|---|---|---|
| Alon-Boppana | λ₂ ≥ 2√(d-1) | Nilli 1991 |
| Ramanujan achievability | λ₂ ≤ 2√(d-1) | LPS 1988 |
| Mixing time | O(log n) | Spectral gap theorem |
| Non-backtracking | Spectral redemption | Bordenave+ 2015 |
Commands
just ramanujan-verify graph.json # Check Ramanujan property just ramanujan-grow graph.json # Add edges preserving property just ramanujan-centrality graph.json # Compute spectral centrality just ramanujan-mixing graph.json # Estimate mixing time just ramanujan-lps 5 13 # Generate LPS(5,13) graph
Related Skills
- Non-backtracking walks and zeta functionsihara-zeta
- Alternating sums on posetsmoebius-inversion
- Network centrality (Layer 7)influence-propagation
- Graph representation as C-setsacsets
- 3-coloring via spectral methodsthree-match