/- Copyright 2026 The Formal Conjectures Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -/ import FormalConjecturesUtil

Idoneal numbers completeness conjecture

An integer $D>0$ is idoneal if every integer that can be expressed in exactly one way (up to order and signs) as $x^2 + D y^2$ with gcd(x, Dy)=1 is a prime power or twice a prime power.

The Idoneal Numbers Completeness Conjecture asserts that the following list of 65 numbers is complete: 1,2,3,4,5,6,7,8,9,10,12,13,15,16,18,21,22,24,25,28,30,33,37,40,42,45,48, 57,58,60,70,72,78,85,88,93,102,105,112,120,130,133,165,168,177,190,210,232, 240,253,273,280,312,330,345,357,385,408,462,520,760,840,1320,1365,1848. References:

namespace Idoneal

Equivalent definition: A positive integer $n$ is idoneal if and only if it cannot be written as $ab + bc + ac$ for distinct positive integers $a, b,$ and $c$.

def IsIdoneal (n : ) : Prop := 0 < n ¬ a b c : , 0 < a a < b b < c n = a * b + b * c + a * c

The 65 known idoneal numbers that are conjectured to be the only idoneal numbers.

def knownIdonealNumbers : Finset := {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 16, 18, 21, 22, 24, 25, 28, 30, 33, 37, 40, 42, 45, 48, 57, 58, 60, 70, 72, 78, 85, 88, 93, 102, 105, 112, 120, 130, 133, 165, 168, 177, 190, 210, 232, 240, 253, 273, 280, 312, 330, 345, 357, 385, 408, 462, 520, 760, 840, 1320, 1365, 1848}

Reduces the unbounded search for a representation n = a*b + b*c + a*c (with 0 < a < b < c) to a bounded, decidable double search over a, b ∈ range (n+1).

The third variable is not searched: for a fixed pair a, b the equation n = a*b + c*(a+b) pins down c = (n - a*b) / (a+b), so the witness c is recovered by exact division. The forward direction uses a, b ≤ n (each pairwise product is at most n) to land the pair in range (n+1).

n:a:b:c:ha:0 < ahab:a < bhbc:b < cheq:n = a * b + b * c + a * chbn:b nhan:a nhsum:n - a * b = c * (a + b)hpos:0 < a + bhc:(n - a * b) / (a + b) = c a Finset.range (n + 1), b Finset.range (n + 1), 0 < a a < b b < (n - a * b) / (a + b) n = a * b + b * ((n - a * b) / (a + b)) + a * ((n - a * b) / (a + b)) exact a, Finset.mem_range.mpr (n:a:b:c:ha:0 < ahab:a < bhbc:b < cheq:n = a * b + b * c + a * chbn:b nhan:a nhsum:n - a * b = c * (a + b)hpos:0 < a + bhc:(n - a * b) / (a + b) = ca < n + 1 All goals completed! 🐙), b, Finset.mem_range.mpr (n:a:b:c:ha:0 < ahab:a < bhbc:b < cheq:n = a * b + b * c + a * chbn:b nhan:a nhsum:n - a * b = c * (a + b)hpos:0 < a + bhc:(n - a * b) / (a + b) = cb < n + 1 All goals completed! 🐙), ha, hab, hc hbc, hc heq n:(∃ a Finset.range (n + 1), b Finset.range (n + 1), 0 < a a < b b < (n - a * b) / (a + b) n = a * b + b * ((n - a * b) / (a + b)) + a * ((n - a * b) / (a + b))) a b c, 0 < a a < b b < c n = a * b + b * c + a * c n:a:left✝¹:a Finset.range (n + 1)b:left✝:b Finset.range (n + 1)ha:0 < ahab:a < bhbc:b < (n - a * b) / (a + b)heq:n = a * b + b * ((n - a * b) / (a + b)) + a * ((n - a * b) / (a + b)) a b c, 0 < a a < b b < c n = a * b + b * c + a * c All goals completed! 🐙set_option maxRecDepth 4096 in

All 65 known idoneal numbers are indeed idoneal.

¬ a Finset.range (1848 + 1), b Finset.range (1848 + 1), 0 < a a < b b < (1848 - a * b) / (a + b) 1848 = a * b + b * ((1848 - a * b) / (a + b)) + a * ((1848 - a * b) / (a + b)) ¬ a Finset.range (1 + 1), b Finset.range (1 + 1), 0 < a a < b b < (1 - a * b) / (a + b) 1 = a * b + b * ((1 - a * b) / (a + b)) + a * ((1 - a * b) / (a + b))¬ a Finset.range (2 + 1), b Finset.range (2 + 1), 0 < a a < b b < (2 - a * b) / (a + b) 2 = a * b + b * ((2 - a * b) / (a + b)) + a * ((2 - a * b) / (a + b))¬ a Finset.range (3 + 1), b Finset.range (3 + 1), 0 < a a < b b < (3 - a * b) / (a + b) 3 = a * b + b * ((3 - a * b) / (a + b)) + a * ((3 - a * b) / (a + b))¬ a Finset.range (4 + 1), b Finset.range (4 + 1), 0 < a a < b b < (4 - a * b) / (a + b) 4 = a * b + b * ((4 - a * b) / (a + b)) + a * ((4 - a * b) / (a + b))¬ a Finset.range (5 + 1), b Finset.range (5 + 1), 0 < a a < b b < (5 - a * b) / (a + b) 5 = a * b + b * ((5 - a * b) / (a + b)) + a * ((5 - a * b) / (a + b))¬ a Finset.range (6 + 1), b Finset.range (6 + 1), 0 < a a < b b < (6 - a * b) / (a + b) 6 = a * b + b * ((6 - a * b) / (a + b)) + a * ((6 - a * b) / (a + b))¬ a Finset.range (7 + 1), b Finset.range (7 + 1), 0 < a a < b b < (7 - a * b) / (a + b) 7 = a * b + b * ((7 - a * b) / (a + b)) + a * ((7 - a * b) / (a + b))¬ a Finset.range (8 + 1), b Finset.range (8 + 1), 0 < a a < b b < (8 - a * b) / (a + b) 8 = a * b + b * ((8 - a * b) / (a + b)) + a * ((8 - a * b) / (a + b))¬ a Finset.range (9 + 1), b Finset.range (9 + 1), 0 < a a < b b < (9 - a * b) / (a + b) 9 = a * b + b * ((9 - a * b) / (a + b)) + a * ((9 - a * b) / (a + b))¬ a Finset.range (10 + 1), b Finset.range (10 + 1), 0 < a a < b b < (10 - a * b) / (a + b) 10 = a * b + b * ((10 - a * b) / (a + b)) + a * ((10 - a * b) / (a + b))¬ a Finset.range (12 + 1), b Finset.range (12 + 1), 0 < a a < b b < (12 - a * b) / (a + b) 12 = a * b + b * ((12 - a * b) / (a + b)) + a * ((12 - a * b) / (a + b))¬ a Finset.range (13 + 1), b Finset.range (13 + 1), 0 < a a < b b < (13 - a * b) / (a + b) 13 = a * b + b * ((13 - a * b) / (a + b)) + a * ((13 - a * b) / (a + b))¬ a Finset.range (15 + 1), b Finset.range (15 + 1), 0 < a a < b b < (15 - a * b) / (a + b) 15 = a * b + b * ((15 - a * b) / (a + b)) + a * ((15 - a * b) / (a + b))¬ a Finset.range (16 + 1), b Finset.range (16 + 1), 0 < a a < b b < (16 - a * b) / (a + b) 16 = a * b + b * ((16 - a * b) / (a + b)) + a * ((16 - a * b) / (a + b))¬ a Finset.range (18 + 1), b Finset.range (18 + 1), 0 < a a < b b < (18 - a * b) / (a + b) 18 = a * b + b * ((18 - a * b) / (a + b)) + a * ((18 - a * b) / (a + b))¬ a Finset.range (21 + 1), b Finset.range (21 + 1), 0 < a a < b b < (21 - a * b) / (a + b) 21 = a * b + b * ((21 - a * b) / (a + b)) + a * ((21 - a * b) / (a + b))¬ a Finset.range (22 + 1), b Finset.range (22 + 1), 0 < a a < b b < (22 - a * b) / (a + b) 22 = a * b + b * ((22 - a * b) / (a + b)) + a * ((22 - a * b) / (a + b))¬ a Finset.range (24 + 1), b Finset.range (24 + 1), 0 < a a < b b < (24 - a * b) / (a + b) 24 = a * b + b * ((24 - a * b) / (a + b)) + a * ((24 - a * b) / (a + b))¬ a Finset.range (25 + 1), b Finset.range (25 + 1), 0 < a a < b b < (25 - a * b) / (a + b) 25 = a * b + b * ((25 - a * b) / (a + b)) + a * ((25 - a * b) / (a + b))¬ a Finset.range (28 + 1), b Finset.range (28 + 1), 0 < a a < b b < (28 - a * b) / (a + b) 28 = a * b + b * ((28 - a * b) / (a + b)) + a * ((28 - a * b) / (a + b))¬ a Finset.range (30 + 1), b Finset.range (30 + 1), 0 < a a < b b < (30 - a * b) / (a + b) 30 = a * b + b * ((30 - a * b) / (a + b)) + a * ((30 - a * b) / (a + b))¬ a Finset.range (33 + 1), b Finset.range (33 + 1), 0 < a a < b b < (33 - a * b) / (a + b) 33 = a * b + b * ((33 - a * b) / (a + b)) + a * ((33 - a * b) / (a + b))¬ a Finset.range (37 + 1), b Finset.range (37 + 1), 0 < a a < b b < (37 - a * b) / (a + b) 37 = a * b + b * ((37 - a * b) / (a + b)) + a * ((37 - a * b) / (a + b))¬ a Finset.range (40 + 1), b Finset.range (40 + 1), 0 < a a < b b < (40 - a * b) / (a + b) 40 = a * b + b * ((40 - a * b) / (a + b)) + a * ((40 - a * b) / (a + b))¬ a Finset.range (42 + 1), b Finset.range (42 + 1), 0 < a a < b b < (42 - a * b) / (a + b) 42 = a * b + b * ((42 - a * b) / (a + b)) + a * ((42 - a * b) / (a + b))¬ a Finset.range (45 + 1), b Finset.range (45 + 1), 0 < a a < b b < (45 - a * b) / (a + b) 45 = a * b + b * ((45 - a * b) / (a + b)) + a * ((45 - a * b) / (a + b))¬ a Finset.range (48 + 1), b Finset.range (48 + 1), 0 < a a < b b < (48 - a * b) / (a + b) 48 = a * b + b * ((48 - a * b) / (a + b)) + a * ((48 - a * b) / (a + b))¬ a Finset.range (57 + 1), b Finset.range (57 + 1), 0 < a a < b b < (57 - a * b) / (a + b) 57 = a * b + b * ((57 - a * b) / (a + b)) + a * ((57 - a * b) / (a + b))¬ a Finset.range (58 + 1), b Finset.range (58 + 1), 0 < a a < b b < (58 - a * b) / (a + b) 58 = a * b + b * ((58 - a * b) / (a + b)) + a * ((58 - a * b) / (a + b))¬ a Finset.range (60 + 1), b Finset.range (60 + 1), 0 < a a < b b < (60 - a * b) / (a + b) 60 = a * b + b * ((60 - a * b) / (a + b)) + a * ((60 - a * b) / (a + b))¬ a Finset.range (70 + 1), b Finset.range (70 + 1), 0 < a a < b b < (70 - a * b) / (a + b) 70 = a * b + b * ((70 - a * b) / (a + b)) + a * ((70 - a * b) / (a + b))¬ a Finset.range (72 + 1), b Finset.range (72 + 1), 0 < a a < b b < (72 - a * b) / (a + b) 72 = a * b + b * ((72 - a * b) / (a + b)) + a * ((72 - a * b) / (a + b))¬ a Finset.range (78 + 1), b Finset.range (78 + 1), 0 < a a < b b < (78 - a * b) / (a + b) 78 = a * b + b * ((78 - a * b) / (a + b)) + a * ((78 - a * b) / (a + b))¬ a Finset.range (85 + 1), b Finset.range (85 + 1), 0 < a a < b b < (85 - a * b) / (a + b) 85 = a * b + b * ((85 - a * b) / (a + b)) + a * ((85 - a * b) / (a + b))¬ a Finset.range (88 + 1), b Finset.range (88 + 1), 0 < a a < b b < (88 - a * b) / (a + b) 88 = a * b + b * ((88 - a * b) / (a + b)) + a * ((88 - a * b) / (a + b))¬ a Finset.range (93 + 1), b Finset.range (93 + 1), 0 < a a < b b < (93 - a * b) / (a + b) 93 = a * b + b * ((93 - a * b) / (a + b)) + a * ((93 - a * b) / (a + b))¬ a Finset.range (102 + 1), b Finset.range (102 + 1), 0 < a a < b b < (102 - a * b) / (a + b) 102 = a * b + b * ((102 - a * b) / (a + b)) + a * ((102 - a * b) / (a + b))¬ a Finset.range (105 + 1), b Finset.range (105 + 1), 0 < a a < b b < (105 - a * b) / (a + b) 105 = a * b + b * ((105 - a * b) / (a + b)) + a * ((105 - a * b) / (a + b))¬ a Finset.range (112 + 1), b Finset.range (112 + 1), 0 < a a < b b < (112 - a * b) / (a + b) 112 = a * b + b * ((112 - a * b) / (a + b)) + a * ((112 - a * b) / (a + b))¬ a Finset.range (120 + 1), b Finset.range (120 + 1), 0 < a a < b b < (120 - a * b) / (a + b) 120 = a * b + b * ((120 - a * b) / (a + b)) + a * ((120 - a * b) / (a + b))¬ a Finset.range (130 + 1), b Finset.range (130 + 1), 0 < a a < b b < (130 - a * b) / (a + b) 130 = a * b + b * ((130 - a * b) / (a + b)) + a * ((130 - a * b) / (a + b))¬ a Finset.range (133 + 1), b Finset.range (133 + 1), 0 < a a < b b < (133 - a * b) / (a + b) 133 = a * b + b * ((133 - a * b) / (a + b)) + a * ((133 - a * b) / (a + b))¬ a Finset.range (165 + 1), b Finset.range (165 + 1), 0 < a a < b b < (165 - a * b) / (a + b) 165 = a * b + b * ((165 - a * b) / (a + b)) + a * ((165 - a * b) / (a + b))¬ a Finset.range (168 + 1), b Finset.range (168 + 1), 0 < a a < b b < (168 - a * b) / (a + b) 168 = a * b + b * ((168 - a * b) / (a + b)) + a * ((168 - a * b) / (a + b))¬ a Finset.range (177 + 1), b Finset.range (177 + 1), 0 < a a < b b < (177 - a * b) / (a + b) 177 = a * b + b * ((177 - a * b) / (a + b)) + a * ((177 - a * b) / (a + b))¬ a Finset.range (190 + 1), b Finset.range (190 + 1), 0 < a a < b b < (190 - a * b) / (a + b) 190 = a * b + b * ((190 - a * b) / (a + b)) + a * ((190 - a * b) / (a + b))¬ a Finset.range (210 + 1), b Finset.range (210 + 1), 0 < a a < b b < (210 - a * b) / (a + b) 210 = a * b + b * ((210 - a * b) / (a + b)) + a * ((210 - a * b) / (a + b))¬ a Finset.range (232 + 1), b Finset.range (232 + 1), 0 < a a < b b < (232 - a * b) / (a + b) 232 = a * b + b * ((232 - a * b) / (a + b)) + a * ((232 - a * b) / (a + b))¬ a Finset.range (240 + 1), b Finset.range (240 + 1), 0 < a a < b b < (240 - a * b) / (a + b) 240 = a * b + b * ((240 - a * b) / (a + b)) + a * ((240 - a * b) / (a + b))¬ a Finset.range (253 + 1), b Finset.range (253 + 1), 0 < a a < b b < (253 - a * b) / (a + b) 253 = a * b + b * ((253 - a * b) / (a + b)) + a * ((253 - a * b) / (a + b))¬ a Finset.range (273 + 1), b Finset.range (273 + 1), 0 < a a < b b < (273 - a * b) / (a + b) 273 = a * b + b * ((273 - a * b) / (a + b)) + a * ((273 - a * b) / (a + b))¬ a Finset.range (280 + 1), b Finset.range (280 + 1), 0 < a a < b b < (280 - a * b) / (a + b) 280 = a * b + b * ((280 - a * b) / (a + b)) + a * ((280 - a * b) / (a + b))¬ a Finset.range (312 + 1), b Finset.range (312 + 1), 0 < a a < b b < (312 - a * b) / (a + b) 312 = a * b + b * ((312 - a * b) / (a + b)) + a * ((312 - a * b) / (a + b))¬ a Finset.range (330 + 1), b Finset.range (330 + 1), 0 < a a < b b < (330 - a * b) / (a + b) 330 = a * b + b * ((330 - a * b) / (a + b)) + a * ((330 - a * b) / (a + b))¬ a Finset.range (345 + 1), b Finset.range (345 + 1), 0 < a a < b b < (345 - a * b) / (a + b) 345 = a * b + b * ((345 - a * b) / (a + b)) + a * ((345 - a * b) / (a + b))¬ a Finset.range (357 + 1), b Finset.range (357 + 1), 0 < a a < b b < (357 - a * b) / (a + b) 357 = a * b + b * ((357 - a * b) / (a + b)) + a * ((357 - a * b) / (a + b))¬ a Finset.range (385 + 1), b Finset.range (385 + 1), 0 < a a < b b < (385 - a * b) / (a + b) 385 = a * b + b * ((385 - a * b) / (a + b)) + a * ((385 - a * b) / (a + b))¬ a Finset.range (408 + 1), b Finset.range (408 + 1), 0 < a a < b b < (408 - a * b) / (a + b) 408 = a * b + b * ((408 - a * b) / (a + b)) + a * ((408 - a * b) / (a + b))¬ a Finset.range (462 + 1), b Finset.range (462 + 1), 0 < a a < b b < (462 - a * b) / (a + b) 462 = a * b + b * ((462 - a * b) / (a + b)) + a * ((462 - a * b) / (a + b))¬ a Finset.range (520 + 1), b Finset.range (520 + 1), 0 < a a < b b < (520 - a * b) / (a + b) 520 = a * b + b * ((520 - a * b) / (a + b)) + a * ((520 - a * b) / (a + b))¬ a Finset.range (760 + 1), b Finset.range (760 + 1), 0 < a a < b b < (760 - a * b) / (a + b) 760 = a * b + b * ((760 - a * b) / (a + b)) + a * ((760 - a * b) / (a + b))¬ a Finset.range (840 + 1), b Finset.range (840 + 1), 0 < a a < b b < (840 - a * b) / (a + b) 840 = a * b + b * ((840 - a * b) / (a + b)) + a * ((840 - a * b) / (a + b))¬ a Finset.range (1320 + 1), b Finset.range (1320 + 1), 0 < a a < b b < (1320 - a * b) / (a + b) 1320 = a * b + b * ((1320 - a * b) / (a + b)) + a * ((1320 - a * b) / (a + b))¬ a Finset.range (1365 + 1), b Finset.range (1365 + 1), 0 < a a < b b < (1365 - a * b) / (a + b) 1365 = a * b + b * ((1365 - a * b) / (a + b)) + a * ((1365 - a * b) / (a + b))¬ a Finset.range (1848 + 1), b Finset.range (1848 + 1), 0 < a a < b b < (1848 - a * b) / (a + b) 1848 = a * b + b * ((1848 - a * b) / (a + b)) + a * ((1848 - a * b) / (a + b)) All goals completed! 🐙

Idoneal numbers completeness conjecture.

@[category research open, AMS 11] theorem idoneal_numbers_completeness : answer(sorry) n : , IsIdoneal n n knownIdonealNumbers := True (n : ), IsIdoneal n n knownIdonealNumbers All goals completed! 🐙end Idoneal