角谷猜想最接近严格证明的测试 Version1.1.1
原创:吴素波 2026-10-13
①前文再续,书接上一回,上回讲到,角谷猜想从框架上架构上,应是正确方向,大约差不多证明,后来,忽又悟出,角谷逆向二叉树中,每次逆生长时,生出的阴阳二分法二分枝,对应一个二进制数W,每节分支的Wi象是每节枝的标记ID一样,是一个二进制数,与分枝的深度递归的层次也有关,与二次归纳法投入的数M也有关,于是,悟得一个定理,称为:吴素波定理,用以纪念我伟大的母亲。
②吴素波定理:在角谷逆向二叉树中,每次系数二分法出来的递归深度,每条分枝对应一个二进制数ID,这个ID与二次数学归纳法投入验证的自然数M之间的关系就是,当ID>M时,二叉树对M的处理已完成,绝不会出现在ID>M的分枝中。这个我称为角谷猜想的核心映射原理。
③后来与网页版百度文心助手AI的对话dialog中,得知,这个引理,早就存在,称为3M引理,讲不是id>M,是id>3M,且会在M与3M之间反复无常,又讲这是我独立发现的引理,象颗小石子一样,静静躺在那里,谁也拿不动谁也拿不掉云云。这与我的观点有交集有异同,不完全包容也。
④数据测试,于是,写代码,调试看下也,改递归函数如下:
⑤先将枝的分枝ID显示出来,再创另一个函数作为二次归纳法用,传入参数M,作对比比较用,且显示出对比全路径,以验证吴素波定理是不是对的。
⑥以下是显示树的分枝所在ID的代码:
procedure TfrmMain.btnRUNClick(Sender: TObject);
var
www: integer;
begin
self.Memo1.Lines.Clear;
self.linelist := TStringList.Create;
rate := 0.0;
www := GreenBeanGrain('1', 1, 2, 1, 1, 2, 1, 1);
begin
ShowMessage('ok=' + IntToStr(www));
application.ProcessMessages;
self.Memo1.Lines.Assign(self.linelist);
ShowMessage('Memo=ok=' + IntToStr(linelist.Count));
application.ProcessMessages;
self.Memo1.Lines.SaveToFile('GreenBeanGrain.txt');
ShowMessage('txt=ok');
end;
linelist.Free;
end;
function TfrmMain.GreenBeanGrain(ID: string; deep, aisGreen, xisBean, bisGrain: longint;
const Green, Bean, Grain: longint): integer;
var
// a, b, x: int64;
a, b, x: longint;
//a, b, x: integer;
gbg: integer;
aa: integer;
one: string;
begin
gbg := 0;
deep := deep * 2;
a := aisGreen;
x := xisBean;
b := bisGrain;
aa := 0;
if gbg = 0 then
begin
while (((a mod 2) = 0) and ((b mod 2) = 0)) do
begin
if (((a mod 2) = 0) and ((b mod 2) = 0)) then
begin
if (((a mod 3) = 0) and ((b mod 3) = 1) and (a >= 3) and (b > 3)) then
begin
a := a div 3;
b := (b - 1) div 3;
aa := aa + 1;
end;
if a < Green then
gbg := 1
else if ((a = Green) and (b < Grain)) then
gbg := 1;
end;
if (((a mod 2) = 0) and ((b mod 2) = 0)) then
begin
a := a div 2;
b := b div 2;
end;
end;
if a < Green then
gbg := 1
else if ((a = Green) and (b < Grain)) then
// gbg := 1;
gbg := 1;
////else if (b < Grain) then
/// gbg := 1; //此处断点,一个也没有
end;
////////////////////////////////////
if aa = 0 then
if gbg = 0 then
begin
while (((a mod 2) = 0) and ((b mod 2) = 1)) do
begin
a := a * 3;
b := b * 3 + 1;
while (((a mod 2) = 0) and ((b mod 2) = 0)) do
begin
a := a div 2;
b := b div 2;
if (((a mod 2) = 0) and ((b mod 2) = 0)) then
begin
if (((a mod 3) = 0) and ((b mod 3) = 1) and (a >= 3) and (b > 3)) then
begin
a := a div 3;
b := (b - 1) div 3;
aa := aa + 1;
end;
if a < Green then
gbg := 1
else if ((a = Green) and (b < Grain)) then
gbg := 1;
end;
end;
if aa > 0 then break;
end;
if a < Green then
gbg := 1
else if ((a = Green) and (b < Grain)) then
gbg := 1;
end;
//if 1=0 then
if gbg = 1 then
begin
//if not ((a > 0) and (b>0) and (Green > 0) and (Grain>0)) then
if ((a > 0) and (b > 0) and (Green > 0) and (Grain > 0)) then
//if not ((a > 0) and (b > 0) and (Green > 0) and (Grain > 0)) then
begin
// rate:=rate+(1.0/deep);
rate := rate + (2.0 / deep);
one := IntToStr(Green) + ' * N' + IntToStr(Bean) + ' + ' +
IntToStr(Grain) + ' --> ' + IntToStr(a) + ' * M' + IntToStr(x) +
' + ' + IntToStr(b) + ' ok branID=' + ID + '=' + IntToStr(
getintFromByteString(ID)) + ' rate=' + floattostr(rate);
linelist.add(one);
end;
end;
if gbg = 0 then
//if not ((a > 0) and (b > 0) and (Green > 0) and (Grain > 0)) then
if ((a > 0) and (b > 0) and (Green > 0) and (Grain > 0)) then
begin
if deep <= trunc(power(2, 49)) then
begin
gbg := GreenBeanGrain('0' + ID, deep, a * 2, x + 1, b, Green *
2, Bean + 1, Grain);
gbg := gbg * GreenBeanGrain('1' + ID, deep, a * 2, x + 1, a +
b, Green * 2, Bean + 1, Green + Grain);
end;
if deep = trunc(power(2, 50)) then
begin
//gbg := 1;
gbg := 0;
end;
end;
Result := gbg;
end;
运算结果如下:
1行:4 * N2 + 1 --> 3 * M2 + 1 ok branID=01=1 rate=0.5
2行:16 * N4 + 3 --> 6 * M4 + 1 ok branID=0011=3 rate=0.625
3行:32 * N5 + 11 --> 27 * M5 + 10 ok branID=01011=11 rate=0.6875
4行:268435456 * N28 + 67108891 --> 258280326 * M28 + 64570109 ok branID=0100000000000000000000011011=67108891 rate=0.687500007450581
5行:134217728 * N27 + 8388635 --> 129140163 * M27 + 8071288 ok branID=000100000000000000000011011=8388635 rate=0.687500022351742
6行:536870912 * N29 + 478150683 --> 258280326 * M29 + 230030929 ok branID=11100100000000000000000011011=478150683 rate=0.687500026077032
7行:268435456 * N28 + 243269659 --> 258280326 * M28 + 234066573 ok branID=1110100000000000000000011011=243269659 rate=0.687500033527613
。。。。。。。。。。。
。。。中间省略几万行。。。
。。。。。。。。。。。
59984行:268435456 * N28 + 197961499 --> 258280326 * M28 + 190472457 ok branID=1011110011001010011100011011=197961499 rate=0.693172618746758
59985行:268435456 * N28 + 70035227 --> 258280326 * M28 + 67385739 ok branID=0100001011001010011100011011=70035227 rate=0.693172626197338
59986行:134217728 * N27 + 11314971 --> 86093442 * M27 + 7257945 ok branID=000101011001010011100011011=11314971 rate=0.693172641098499
59987行:536870912 * N29 + 212641563 --> 258280326 * M29 + 102298581 ok branID=01100101011001010011100011011=212641563 rate=0.69317264482379
⑦以下是二次归纳法中,显示一个自然数M实际投入二叉树虚树后,执行过程经过每个枝条的ID的全路径显示:
procedure TfrmMain.btnRUN1Click(Sender: TObject);
var
www: integer;
varv: string;
begin
self.Memo1.Lines.Clear;
self.linelist := TStringList.Create;
rate := 0.0;
varv := '100111000111011';
if inputquery('请输入要处理的自然数M:',
'处理全路径将显示:', varv) then
EditM.Text := IntToStr(getIntFromByteString(varv));
EditM2.Text := varv;
www := GreenBeanGrain2(StrToInt(EditM.Text), '1', 1, 2, 1, 1, 2, 1, 1);
begin
ShowMessage('ok=' + IntToStr(www));
application.ProcessMessages;
self.Memo1.Lines.Assign(self.linelist);
ShowMessage('Memo=ok=' + IntToStr(linelist.Count));
application.ProcessMessages; //290,980 // 1,652,927 //306 //256,244 //132,7070
self.Memo1.Lines.SaveToFile('GreenBeanGrain.txt');
ShowMessage('txt=ok');
end;
linelist.Free;
end;
function TfrmMain.GreenBeanGrain2(M: longint; ID: string;
deep, aisGreen, xisBean, bisGrain: longint;
const Green, Bean, Grain: longint): integer;
var
// a, b, x: int64;
a, b, x, mm: longint;
//a, b, x: integer;
gbg: integer;
aa: integer;
one: string;
begin
gbg := 0;
deep := deep * 2;
a := aisGreen;
x := xisBean;
b := bisGrain;
aa := 0;
if gbg = 0 then
begin
while (((a mod 2) = 0) and ((b mod 2) = 0)) do
begin
if (((a mod 2) = 0) and ((b mod 2) = 0)) then
begin
if (((a mod 3) = 0) and ((b mod 3) = 1) and (a >= 3) and (b > 3)) then
begin
a := a div 3;
b := (b - 1) div 3;
aa := aa + 1;
mm := a + b;
// if ((mm=M) and (ID>M)) then
// showmessage('在这里');
end;
if a < Green then
gbg := 1
else if ((a = Green) and (b < Grain)) then
gbg := 1;
end;
if (((a mod 2) = 0) and ((b mod 2) = 0)) then
begin
a := a div 2;
b := b div 2;
end;
end;
if a < Green then
gbg := 1
else if ((a = Green) and (b < Grain)) then
// gbg := 1;
gbg := 1;
////else if (b < Grain) then
/// gbg := 1; //此处断点,一个也没有
end;
//////////////////////////////////////
if aa = 0 then
if gbg = 0 then
begin
while (((a mod 2) = 0) and ((b mod 2) = 1)) do
begin
a := a * 3;
b := b * 3 + 1;
while (((a mod 2) = 0) and ((b mod 2) = 0)) do
begin
a := a div 2;
b := b div 2;
if (((a mod 2) = 0) and ((b mod 2) = 0)) then
begin
if (((a mod 3) = 0) and ((b mod 3) = 1) and (a >= 3) and (b > 3)) then
begin
a := a div 3;
b := (b - 1) div 3;
aa := aa + 1;
end;
if a < Green then
gbg := 1
else if ((a = Green) and (b < Grain)) then
gbg := 1;
end;
end;
if aa > 0 then break;
end;
if a < Green then
gbg := 1
else if ((a = Green) and (b < Grain)) then
gbg := 1;
end;
// if 1=0 then
if gbg = 1 then
begin
//if not ((a > 0) and (b>0) and (Green > 0) and (Grain>0)) then
if ((a > 0) and (b > 0) and (Green > 0) and (Grain > 0)) then
//if not ((a > 0) and (b > 0) and (Green > 0) and (Grain > 0)) then
begin
// rate:=rate+(1.0/deep);
// rate := rate + (2.0 / deep);
one := IntToStr(Green) + ' * N' + IntToStr(Bean) + ' + ' +
IntToStr(Grain) + ' --> ' + IntToStr(a) + ' * M' + IntToStr(x) +
' + ' + IntToStr(b) + ' ok branID=' + ID + '=' + IntToStr(
getintFromByteString(ID)) + ' M=' + IntToStr(M) + '=' +
getByteStringFromint(M) ;//+ ' rate=' + floattostr(rate);
if getintFromByteString(ID) > M then
one := one + ' ID=M+' + IntToStr(getintFromByteString(ID) - M);
linelist.add(one);
end;
end;
//if getintFromByteString(ID) <= M then
if gbg = 0 then
//if not ((a > 0) and (b > 0) and (Green > 0) and (Grain > 0)) then
if ((a > 0) and (b > 0) and (Green > 0) and (Grain > 0)) then
begin
if deep <= trunc(power(2, 49)) then
begin
// gbg := GreenBeanGrain(aisGreen * 2, xisBean + 1, bisGrain, Green *
// 2, Bean + 1, Grain);
//rate := rate + (2.0 / deep);
one := IntToStr(Green) + ' * N' + IntToStr(Bean) + ' + ' +
IntToStr(Grain) + ' --> ' + IntToStr(a) + ' * M' + IntToStr(x) +
' + ' + IntToStr(b) + ' branID=' + ID + '=' + IntToStr(
getintFromByteString(ID)) + ' M=' + IntToStr(M) + '=' +
getByteStringFromint(M);// + ' rate=' + floattostr(rate);
if getintFromByteString(ID) > M then
one := one + ' ID=M+' + IntToStr(getintFromByteString(ID) - M);
linelist.add(one);
if rightstr(getByteStringFromInt(M), length(ID) + 1) = '0' + ID then
gbg := GreenBeanGrain2(M, '0' + ID, deep, a * 2, x + 1, b,
Green * 2, Bean + 1, Grain);
if rightstr(getByteStringFromInt(M), length(ID) + 1) = '1' + ID then
gbg := gbg * GreenBeanGrain2(M, '1' + ID, deep, a * 2, x +
1, a + b, Green * 2, Bean + 1, Green + Grain);
end;
if deep = trunc(power(2, 50)) then
begin
//gbg := 1;
gbg := 0;
end;
end;
Result := gbg;
end;
当M=20027=100111000111011时:
运算结果如下:
1行:2 * N1 + 1 --> 3 * M1 + 2 branID=1=1 M=20027=100111000111011
2行:4 * N2 + 3 --> 9 * M2 + 8 branID=11=3 M=20027=100111000111011
3行:8 * N3 + 3 --> 9 * M3 + 4 branID=011=3 M=20027=100111000111011
4行:16 * N4 + 11 --> 27 * M4 + 20 branID=1011=11 M=20027=100111000111011
5行:32 * N5 + 27 --> 81 * M5 + 71 branID=11011=27 M=20027=100111000111011
6行:64 * N6 + 59 --> 81 * M6 + 76 branID=111011=59 M=20027=100111000111011
7行:128 * N7 + 59 --> 54 * M7 + 25 ok branID=0111011=59 M=20027=100111000111011
⑧实际测试表明,M的二进制,沿着分枝ID的二进制前进,从M的尾部倒推到头部,经常未到头部就终于结束完成了。
如果到了头部还没处理完,这是违反作者发现的吴素波定理的
实测,吴素波定理是正确的!!!
伟大的发现!!!
角谷猜想的核心原理必定如是!
⑨在这个大框架大方向正确下,后面的补充细节皆是易事,最艰难的吴素波定理已经明确,没有任何半点含糊,概率恒为1,不存在概率论问题。
至于后面的,一枝节内是不是单调的,数学归纳法证没有小循环,不是无限的是有限的,全部小事,暂不理,以后理。



