问题

95% 的人解不出这道题《史上最贱的数学题》能否用数学软件计算出来?

回答
95% 的人解不出? 这道“史上最贱的数学题”,数学软件真能算出来吗?

网络上流传着一个说法,说有一道题,高达95%的人都解不出来,并被冠以“史上最贱的数学题”的名号。这听起来就让人好奇,究竟是什么样的题目,能让如此多的人望而却步?更进一步,我们不禁要问:那些强大的数学软件,比如Mathematica、MATLAB、Maple,它们能轻松搞定这道“贱”题吗?今天,我们就来一探究竟,并尽量细致地聊聊这个话题,顺便看看数学软件的能耐。

首先,我们得知道这道“最贱的数学题”究竟是什么。网上流传的版本很多,但有一个流传甚广且确实有点“绕”的题目是这样的:

题目:

一个旅行者要去一个遥远的城市,他需要翻越三座山。

第一座山,他需要花费 2 天时间爬上去,然后花费 1 天时间下来。
第二座山,他需要花费 3 天时间爬上去,然后花费 2 天时间下来。
第三座山,他需要花费 4 天时间爬上去,然后花费 3 天时间下来。

旅行者必须按照顺序翻越这三座山。在翻越每一座山的时候,他都需要一天时间来休息。

问题是:旅行者总共需要多少天才能完成这次旅行?

乍一看,这题目简单得不能再简单,加加减减就能得出结果。很多人会直接把每一座山的爬升和下降时间以及休息时间加起来:

(2天爬 + 1天下 + 1天休息) + (3天爬 + 2天下 + 1天休息) + (4天爬 + 3天下 + 1天休息) = (4天) + (6天) + (8天) = 18天。

然而,正是这个看似直观的答案,却让95%的人“栽了跟头”。为什么呢?

问题的“贱”在哪儿?

这里的“贱”或者说“坑”,在于对“翻越”这个动作的理解。题目并没有明确说明,休息一天是在爬山之前、爬山之后,还是在山顶休息。更关键的是,“翻越”一整座山,是不是意味着“到达山顶”就算完成了一部分的行程,还是必须“安全到达山脚”才算完成?

如果我们仔细品味“翻越”这个词,它通常指的是“跨越、越过”。而一次完整的“翻越”一座山,显然包括了到达山顶和下到山脚这两个过程。

让我们重新审视一下行程:

第一座山:
爬上去:2天
到达山顶,此时旅行者已经“爬上”去了,但还没有“翻越”成功。
在山顶休息:1天 (这里是关键,如果休息完了才下山,是不是意味着他在山顶度过了一个完整的“休息日”?)
下山:1天
完成第一座山的翻越,到达山脚。

第二座山:
爬上去:3天
到达山顶。
在山顶休息:1天
下山:2天
完成第二座山的翻越,到达山脚。

第三座山:
爬上去:4天
到达山顶。
在山顶休息:1天
下山:3天
完成第三座山的翻越,到达山脚。

按照这个更细致的理解,我们计算一下:

第一座山: 2天(爬)+ 1天(休息)+ 1天(下) = 4天
第二座山: 3天(爬)+ 1天(休息)+ 2天(下) = 6天
第三座山: 4天(爬)+ 1天(休息)+ 3天(下) = 8天

总计:4 + 6 + 8 = 18天。

等等,这和我们最初的计算结果一样!那问题到底出在哪里?

真正的“贱”所在:休息日的安排和“翻越”的结束点

这里还有一个更深层的解读,也是许多人出错的根源:休息日是否必须是“完整的”一天,并且放在“到达山顶”之后?

有一种更“贱”的解释是:你爬完山,到达山顶,然后你就需要休息。这个休息日是包含在“翻越”过程中的。而你只有在完成“翻越”后,才能进行下一个“翻越”的准备。

换句话说,旅行者在到达山顶后,需要“休息一天”,然后才能开始下山。这个休息日,可能会导致行程上的“衔接”问题。

让我们试着另一种思路来分解:

1. 完成第一座山的“爬升”: 2天。旅行者到达山顶。
2. 在第一座山顶休息: 1天。
3. 下第一座山: 1天。完成第一座山的翻越。
4. 开始第二座山的“爬升”: 3天。旅行者到达第二座山的山顶。
5. 在第二座山顶休息: 1天。
6. 下第二座山: 2天。完成第二座山的翻越。
7. 开始第三座山的“爬升”: 4天。旅行者到达第三座山的山顶。
8. 在第三座山顶休息: 1天。
9. 下第三座山: 3天。完成第三座山的翻越。

这样计算,总计是:2 + 1 + 1 + 3 + 1 + 2 + 4 + 1 + 3 = 18天。

看起来还是18天?这道题到底怎么让人解不出来?

问题的“贱”通常还体现在信息的模糊性和常识的误导。很多人会被“爬升”和“下降”的时间差所困扰,或者在“休息”这个环节上纠结。

最普遍的“坑”:

很多人会在计算休息日的时候出现错误,例如:

误以为休息日是包含在爬升或下降时间内的。
误以为在到达山顶的当天,就可以直接开始下山,而不需要额外的休息时间。

正确的、通常被认为是“标准答案”的解法是:

第一座山: 爬上去 (2天) + 休息 (1天) + 下来 (1天) = 4天
第二座山: 爬上去 (3天) + 休息 (1天) + 下来 (2天) = 6天
第三座山: 爬上去 (4天) + 休息 (1天) + 下来 (3天) = 8天

总计:4 + 6 + 8 = 18天。

那么,那些所谓的“95%的人解不出来”,是不是因为存在更复杂的解法?

这道题之所以被称作“贱”,更多的是因为它通过看似清晰但实际隐藏了陷阱的描述,让人们在简单加减法的思维定势中犯错。它考验的是对“完成一个阶段”、“休息”、“下一个阶段开始”这些概念的精确理解。

数学软件能算出来吗?

答案是:能,而且非常容易。

为什么数学软件能轻松算出答案,而许多人会出错呢?

1. 数学软件不会“想当然”: 它们是根据输入的逻辑和运算符进行计算的。如果你将题目中的数字直接输入,并用加法连接,软件会给出18。

2. 数学软件没有“常识”和“误导”: 软件不会去猜测“最贱”的意图,也不会被“95%的人解不出”的说法所影响。它只执行你交给它的指令。

我们如何在数学软件中“表达”这个题目?

我们可以将这个题目分解成几个步骤,然后让软件一步步计算。

以Mathematica为例:

```mathematica
( 定义爬升、休息、下降的天数 )
climb1 = 2;
rest1 = 1;
descend1 = 1;

climb2 = 3;
rest2 = 1;
descend2 = 2;

climb3 = 4;
rest3 = 1;
descend3 = 3;

( 计算每一座山的总耗时 )
time1 = climb1 + rest1 + descend1;
time2 = climb2 + rest2 + descend2;
time3 = climb3 + rest3 + descend3;

( 计算总耗时 )
totalTime = time1 + time2 + time3;

( 输出结果 )
Print["第一座山总耗时:", time1, " 天"];
Print["第二座山总耗时:", time2, " 天"];
Print["第三座山总耗时:", time3, " 天"];
Print["总旅行时间:", totalTime, " 天"];
```

运行这段代码,Mathematica 会直接输出:

```
第一座山总耗时:4 天
第二座山总耗时:6 天
第三座山总耗时:8 天
总旅行时间:18 天
```

再比如MATLAB:

```matlab
% 定义爬升、休息、下降的天数
climb1 = 2;
rest1 = 1;
descend1 = 1;

climb2 = 3;
rest2 = 1;
descend2 = 2;

climb3 = 4;
rest3 = 1;
descend3 = 3;

% 计算每一座山的总耗时
time1 = climb1 + rest1 + descend1;
time2 = climb2 + rest2 + descend2;
time3 = climb3 + rest3 + descend3;

% 计算总耗时
totalTime = time1 + time2 + time3;

% 输出结果
fprintf('第一座山总耗时:%d 天 ', time1);
fprintf('第二座山总耗时:%d 天 ', time2);
fprintf('第三座山总耗时:%d 天 ', time3);
fprintf('总旅行时间:%d 天 ', totalTime);
```

MATLAB的输出也会是:

```
第一座山总耗时:4 天
第二座山总耗时:6 天
第三座山总耗时:8 天
总旅行时间:18 天
```

为什么我们强调“95%的人解不出来”,而不是“100%的人解不出来”?

这正是这道题的精妙之处。它并非一个无法解决的数学难题,而是一个对理解能力和逻辑思维的考验。总会有一部分人能够准确无误地理解题目中的每一个细节,并进行正确的计算。

数学软件的“弱点”与人类的“强项”

虽然数学软件能轻松计算出18天,但它们无法“理解”这道题的“贱”在哪里。它们只是按照指令进行计算。而人类的优势在于,我们可以分析题目的表述,去思考隐藏的逻辑和可能的陷阱。

那些可能让人们出错的“非标准”解读:

虽然18天是普遍接受的答案,但如果题目真的要“贱”到极致,理论上还可以有其他解读,比如:

休息日是否一定在山顶? 如果休息日可以在下山后,或者在出发前一天,那计算方式又不同了。但题目明确说“翻越每一座山”,暗示休息是与这座山绑定的。
“翻越”是否包括了到达山顶当天就开始下山? 如果是这样,那么爬升2天,到达山顶,然后当天就开始下山(1天),那第一座山就花了2+1=3天。但这似乎与“休息一天”的描述相悖。

结论:

这道“史上最贱的数学题”,其“贱”在于它用看似简单的文字,巧妙地设置了一个逻辑陷阱,考验的是对细节的关注和对描述的精确理解。数学软件,如Mathematica、MATLAB等,能够准确地计算出结果(通常是18天),因为它们按照逻辑规则执行指令。

但是,数学软件无法真正“领会”这道题的“精髓”——那种让人因为忽略细节而出错的“贱”感。 这恰恰是人类思维的独到之处:我们在解决问题的同时,还能分析问题本身的“设计”。

所以,与其说数学软件“解”出了这道题,不如说它“执行”了这道题的计算。而真正“解”出这道题的人,是那些能够透过表象,准确把握题意的思考者。即便有95%的人“解不出来”,那也是因为他们可能在某个环节过于直观,或者没有注意到那种“细思极恐”的描述。

网友意见

user avatar

这个有点意思。我写了个长整的数据类型,定义了加减乘除运算,然后验算了一下文章给出的解,结论是他的结果是对的(跟没说一样)。我的长整类型是个数组,第一个数是正负号,第二个数是个位,第三个数是十位,以此类推。先新建一个longInteger.m,把后边的代码存进去,然后运行下边的主程序,你会发现a*(a+b)*(a+c)+b*(b+a)*(b+c)+c*(c+a)*(c+b)=4*(a+b)*(a+c)*(b+c)是成立的,等号两边是241位的数。

       lI=longInteger(); a=lI.new('154476802108746166441951315019919837485664325669565431700026634898253202035277999'); b=lI.new('36875131794129999827197811565225474825492979968971970996283137471637224634055579'); c=lI.new('4373612677928697257861252602371390152816537558161613618621437993378423467772036'); %a*(a+b)*(a+c)+b*(b+a)*(b+c)+c*(c+a)*(c+b)=4*(a+b)*(a+c)*(b+c) left=lI.add3(lI.mult3(a,lI.add(a,b),lI.add(a,c)),lI.mult3(b,lI.add(b,a),lI.add(b,c)),lI.mult3(c,lI.add(c,a),lI.add(c,b))); right=lI.mult4(lI.new('4'),lI.add(a,b),lI.add(a,c),lI.add(b,c)); lI.minus(left,right)     

如果关注的人多且我能算出来,我就告诉大家那个 和 是怎么确定的

我读了两篇论文,基本知道怎么弄的了。好奇宝宝请猛戳这里看原文。

先说代码怎么玩。前边的常整数longInteger.m更新了,另外我又写了几个数据类型,代码贴在最后边,先把它们保存称单独的文件。:

长分数longFrac.m,两个长整型数,第一个是分子,第二个是分母。支持加减乘除,可以自动约分。

长矩阵 longMatrix.m,元素都是长分数,是个结构体,记录长宽m和n,数据存成一列,先是第一列再第二列再第三列。没写加减乘除只写了逆矩阵。

长多项式longPoly.m,是个结构体,包括.power和.coeff。.coeff是长分数系数,.power是变量的指数。每一行是一项。这个结构体可以加减乘除,自动合并同类项,可以把长分数代入里边的变量,可以把另一个多项式代入里边的变量。

再说文章里介绍的方法:

1 这个方程是 ,找到它过一个点P(a,b,c)=[-1,1,0]。

       clear lI=longInteger(); lF=longFrac(lI); lM=longMatrix(lF); lP=longPoly(lF); a=lP.new({[1 1],[1 1]},1,1); b=lP.new({[1 1],[1 1]},2,1); c=lP.new({[1 1],[1 1]},3,1); x1=lP.mult3(a,lP.add(a,b),lP.add(a,c)); x2=lP.mult3(b,lP.add(b,a),lP.add(b,c)); x3=lP.mult3(c,lP.add(c,a),lP.add(c,b)); right=lP.mult4(lP.new({lI.new('4'),lI.new('1')},0,0),lP.add(a,b),lP.add(b,c),lP.add(c,a)); left=lP.add3(x1,x2,x3); equ0=lP.minus(left,right); equ0_string=lP.display(equ0)     


2 求这条曲线在P点上的切线,这道题求出来是Z=6a+6b-c。

       P={[-1 1],[1 1];[1 1],[1 1];0,[1 1]}; lineZ=lP.new({0,[1 1]},0,0); for i=1:3     diff1=lP.diff(equ0,i);     diff1=lP.subtitConst(diff1,[1 2 3],P);     lineZ=lP.add(lineZ,lP.mult(diff1,lP.minus(lP.new({[1 1],[1 1]},i,1),lP.new(P(i,:),0,0)))); end lineZ_string=lP.display(lineZ)     


3 把c=6a+6b代入F,你会得到 91*(a+b)^3。这是三个根摞在一起的情况,还有可能是两个重根加一个单独根,跟这道题没关系。


4 三个重根的情况下就在Z上F外随便找一个点Q,我找的是Q=[1,1,12],只要在Z上且不在F上就行,对结果没影响的。

5 然后再更随便的找一个P3=[1 0 0],组成一个变换矩阵 ,可以把abc坐标系变成def坐标系

       Q={[1 1],[1 1];[1 1],[1 1];[1 2 1],[1 1]}; P3={[1 1],[1 1];0,[1,1];0,[1 1]}; M1=lM.zeros(3,3); M1.values([1 4 7],:)=Q; M1.values([2 5 8],:)=P; M1.values([3 6 9],:)=P3; M1inv=lM.inv(M1); d2abc=lP.add3(lP.new(M1inv.values(1,:),1,1),lP.new(M1inv.values(2,:),2,1),lP.new(M1inv.values(3,:),3,1)); e2abc=lP.add3(lP.new(M1inv.values(4,:),1,1),lP.new(M1inv.values(5,:),2,1),lP.new(M1inv.values(6,:),3,1)); f2abc=lP.add3(lP.new(M1inv.values(7,:),1,1),lP.new(M1inv.values(8,:),2,1),lP.new(M1inv.values(9,:),3,1)); a2def=lP.add3(lP.new(M1.values(1,:),4,1),lP.new(M1.values(2,:),5,1),lP.new(M1.values(3,:),6,1)); b2def=lP.add3(lP.new(M1.values(4,:),4,1),lP.new(M1.values(5,:),5,1),lP.new(M1.values(6,:),6,1)); c2def=lP.add3(lP.new(M1.values(7,:),4,1),lP.new(M1.values(8,:),5,1),lP.new(M1.values(9,:),6,1)); equ1=equ0; equ1=lP.subtitPoly(equ1,1,a2def); equ1=lP.subtitPoly(equ1,2,b2def); equ1=lP.subtitPoly(equ1,3,c2def); idx1=sum(equ1.power(:,4:6)==[3 0 0],2)==3; %set coeff of d^3 to 1 frac1=equ1.coeff(idx1,:); equ1=lP.mult(equ1,lP.new(frac1(1,[2 1]),0,0)); equ1_string=lP.display(equ1)     

6 上一步算出来的equ1_string='+d^3-d^2*f*285/364+e^2*f*3/364-d*f^2*9/182-e*f^2*3/364+f^3*1/728',里边没有e^3项只有e^2项。接下来再把e^1项消掉就变成那个著名的Weierstrass形式了。

       idx1=sum(equ1.power(:,4:6)==[0 2 1],2)==3; %make coeff of e^2*f to 1 f2g=lP.new(equ1.coeff(idx1,[2 1]),7,1); f2g=lP.neg(f2g); g2f=[]; g2f.coeff=lF.validate(f2g.coeff(1,[2 1])); g2f.power=[0 0 0 0 0 1 0]; g2abc=lP.subtitPoly(g2f,6,f2abc); equ2=lP.subtitPoly(equ1,6,f2g); equ2_string=lP.display(equ2)  idx1=sum(equ2.power(:,[5 7])==[1 2],2)==2; %take out e*g term frac1=lF.mult(equ2.coeff(idx1,:),{[1 1],[1 2]}); e2h=[]; e2h.coeff=[{[1 1],[1 1]};frac1]; e2h.power=[0 0 0 0 0 0 0 1;0 0 0 0 0 0 1 0]; h2e=[]; h2e.coeff=[{[1 1],[1 1]};lF.neg(frac1)]; h2e.power=[0 0 0 0 1 0 0 0;0 0 0 0 0 0 1 0]; equ3=lP.subtitPoly(equ2,5,e2h); equ3_string=lP.display(equ3) h2abc=lP.subtitPoly(h2e,5,e2abc); h2abc=lP.subtitPoly(h2abc,7,g2abc); d2abc_string=lP.display(d2abc) g2abc_string=lP.display(g2abc) h2abc_string=lP.display(h2abc)     

结果是

7 还可以验证算出来的对不对,把d2abc,g2abc,h2abc代入equ3算出equ4,结果和equ0是一样的。

       equ4=equ3; equ4=lP.subtitPoly(equ4,4,d2abc); equ4=lP.subtitPoly(equ4,7,g2abc); equ4=lP.subtitPoly(equ4,8,h2abc); equ4_string=lP.display(equ4)     


过几天接茬更新。下边是几个数据类型,要存到相应的.m文件里

长整类型,存到 longInteger.m

       %save to longInteger.m function lI=longInteger() % longInteger x=x1*(x2+x3*10+x4*100+x5*1000+...) % x=0 means 0     function y=neg(x1)         y=x1;         y(1)=-y(1);     end     function y=validate(x1)         flag1=1;         y=x1;         y(1)=sign(y(1));         n1=numel(y);         while flag1             if n1==1                 y=0;                 flag1=0;             elseif y(n1)==0                 n1=n1-1;             elseif y(n1)<0                 y=-y;             elseif y(n1)>9                 y(n1+1)=floor(y(n1)/10);                 y(n1)=mod(y(n1),10);                 n1=n1+1;             else                 idx1=find(y(2:n1)>9 | y(2:n1)<0)+1;                 inc1=floor(y(idx1)/10);                 y(idx1+1)=y(idx1+1)+inc1;                 y(idx1)=y(idx1)-inc1*10;                 if isempty(idx1)                     flag1=0;                 end             end         end         y=y(1:n1);     end     function y=new(str1)         sign1=1;         if str1(1)=='+'             str1=str1(2:end);         elseif str1(1)=='-'             str1=str1(2:end);             sign1=-1;         end         n1=numel(str1)+1;         y=zeros(1,n1);         y(1)=sign1;         for i=2:n1             y(i)=str1(n1-i+1)-'0';         end         y=validate(y);             end     function y=display(x)         if sum(abs(x))==0             y='0';         else             y=[' ','0'+x(end:-1:2)];             if x(1)==1                 y(1)='+';             else                 y(1)='-';             end            end     end     function y=add(x1,x2)%x=x1*(x2+x3*10+x4*100+x5*1000+...)         n1=numel(x1);         n2=numel(x2);         if n1>=n2             y=x1;             y(2:n2)=y(2:n2)+sign(x1(1)*x2(1))*x2(2:n2);         else             y=x2;             y(2:n1)=y(2:n1)+sign(x1(1)*x2(1))*x1(2:n1);         end         y=validate(y);     end     function y=add3(x1,x2,x3)         y=add(add(x1,x2),x3);     end     function y=add4(x1,x2,x3,x4)         y=add(add3(x1,x2,x3),x4);     end     function y=add5(x1,x2,x3,x4,x5)         y=add(add4(x1,x2,x3,x4),x5);     end     function y=minus(x1,x2)         y=add(x1,neg(x2));     end     function y=mult(x1,x2)         n1=numel(x1);         n2=numel(x2);         y=zeros(1,n1+n2);         y(1)=sign(x1(1)*x2(1));         for i=2:n1             y(i+(2:n2)-2)=y(i+(2:n2)-2)+x1(i)*x2(2:n2);         end         y=validate(y);     end     function y=mult3(x1,x2,x3)         y=mult(mult(x1,x2),x3);     end     function y=mult4(x1,x2,x3,x4)         y=mult(mult3(x1,x2,x3),x4);     end     function y=mult5(x1,x2,x3,x4,x5)         y=mult(mult4(x1,x2,x3,x4),x5);     end     function y=compare(x1,x2) %x1>x2->1, x1<x2->-1, x1==x2->0         x11=validate(x1);         x22=validate(x2);         if x11(1)>x22(1)             y=1;         elseif x11(1)<x22(1)             y=-1;         else             n1=numel(x11);             n2=numel(x22);             y=0;             if n1>n2                 y=1;             elseif n1<n2                 y=-1;             else                 while n1>1 && y==0                     if x11(n1)>x22(n1)                         y=1;                     elseif x11(n1)<x22(n1)                         y=-1;                     else                         n1=n1-1;                     end                 end             end             y=y*x11(1);         end     end     function [q,r]=div(x1,x2)         n1=numel(x1);         n2=numel(x2);         if x2==0             q=NaN;             r=NaN;         else             q=zeros(1,n1);             q(1)=sign(x1(1)*x2(1));             r=x1;             n3=n1;             while n3>1                 if compare([1 r(n3:n1)],[1 x2(2:n2)])>=0                     q(n3)=q(n3)+1;                     r(n3+(0:n2-2))=r(n3+(0:n2-2))-x2(2:n2);                 else                     n3=n3-1;                 end             end             q=validate(q);             r=validate(r);         end     end     function y=gcd(x1,x2)         m=x1;         n=x2;         m(1)=1;         n(1)=1;         r=[1 1];         while numel(r)>1 %r~=0             [~,r]=div(m,n);             m=n;             n=r;         end         y=m;     end lI=[]; lI.validate=@validate; lI.new=@new; lI.display=@display; lI.add=@add; lI.add3=@add3; lI.add4=@add4; lI.add5=@add5; lI.minus=@minus; lI.neg=@neg; lI.mult=@mult; lI.mult3=@mult3; lI.mult4=@mult4; lI.mult5=@mult5; lI.compare=@compare; lI.div=@div; lI.gcd=@gcd; end     


长分数类型,存到 longFrac.m

       %save to longFrac.m function lF=longFrac(lI)     function y=validate(F1)         y=F1;         if y{2}(1)==0             y{1}=NaN;         else             if y{2}(1)==-1                 y{1}=lI.neg(y{1});                 y{2}=lI.neg(y{2});             end             I1=lI.gcd(y{1},y{2});             y{1}=lI.div(y{1},I1);             y{2}=lI.div(y{2},I1);         end      end     function y=new(I1,I2)         y=cell(1,2);         y{1}=I1;         y{2}=I2;         y=validate(y);     end     function y=neg(F1)         y=F1;         y{1}=lI.neg(y{1});     end     function y=add(F1,F2)         y=cell(1,2);         y{1}=lI.add(lI.mult(F1{1},F2{2}),lI.mult(F1{2},F2{1}));         y{2}=lI.mult(F1{2},F2{2});         y=validate(y);     end     function y=add3(F1,F2,F3)         y=add(add(F1,F2),F3);     end     function y=add4(F1,F2,F3,F4)         y=add(add3(F1,F2,F3),F4);     end     function y=add5(F1,F2,F3,F4,F5)         y=add(add4(F1,F2,F3,F4),F5);     end     function y=minus(F1,F2)         y=add(F1,neg(F2));     end     function y=mult(F1,F2)         y=cell(1,2);         y{1}=lI.mult(F1{1},F2{1});         y{2}=lI.mult(F1{2},F2{2});         y=validate(y);     end     function y=mult3(F1,F2,F3)         y=mult(mult(F1,F2),F3);     end     function y=mult4(F1,F2,F3,F4)         y=mult(mult3(F1,F2,F3),F4);     end     function y=mult5(F1,F2,F3,F4,F5)         y=mult(mult4(F1,F2,F3,F4),F5);     end     function y=div(F1,F2)         y=cell(1,2);         y{1}=lI.mult(F1{1},F2{2});         y{2}=lI.mult(F1{2},F2{1});         y=validate(y);     end     function y=display(F1)         if numel(F1{2})==2 && F1{2}(2)==1             y=lI.display(F1{1});         else             y=lI.display(F1{2});             y=[lI.display(F1{1}) '/' y(2:end)];         end     end lF=[]; lF.validate=@validate; lF.new=@new; lF.neg=@neg; lF.add=@add; lF.add3=@add3; lF.add4=@add4; lF.add5=@add5; lF.minus=@minus; lF.mult=@mult; lF.mult3=@mult3; lF.mult4=@mult4; lF.mult5=@mult5; lF.div=@div; lF.display=@display; end     


长矩阵类型,存到 longMatrix.m

       %save to longMatrix.m function lM=longMatrix(lF)     function y=zeros(m,n)         y=[];         y.m=m;         y.n=n;         y.values=cell(m*n,2);         for i=1:m*n             y.values{i,1}=0;             y.values{i,2}=[1 1];         end             end     function y=ones(m,n)         y=[];         y.m=m;         y.n=n;         y.values=cell(m*n,2);         for i=1:m*n             y.values{i,1}=[1 1];             y.values{i,2}=[1 1];         end             end     function y=neg(M1)         y=M1;         for i=1:y.m*y.n             y.values(i,:)=lF.neg(y.values(i,:));         end     end     function y=validate(M1)         y=M1;         for i=1:M1.m*M1.n             y.values(i,:)=lF.validate(M1.values(i,:));         end     end     function y=inv(M1)         if M1.m~=M1.n             y=NaN;         else             m=M1.m;             values=cell(m*m*2,2);             values(1:m*m,:)=M1.values;             for i=1:m*m                 values{m*m+i,1}=0;                 values{m*m+i,2}=[1 1];             end             for i=1:m                 values{m*m+(i-1)*m+i,1}=[1 1];             end             for i=1:m                 flag1=0;                 idx1=i;                 while flag1==0                     if numel(values{(i-1)*m+idx1,1})>1                         flag1=1;                     elseif idx1==m                         flag1=2;                     else                         idx1=idx1+1;                     end                 end                 if flag1==1                     values([(0:m-1)*m+i (0:m-1)*m+idx1],:)=values([(0:m-1)*m+idx1 (0:m-1)*m+i],:);                     for k=i+1:m*2                         values((k-1)*m+i,:)=lF.div(values((k-1)*m+i,:),values((i-1)*m+i,:));                     end                     values{(i-1)*m+i,1}=[1 1];                     values{(i-1)*m+i,2}=[1 1];                     for j=[1:i-1 i+1:m]                         for k=i+1:m*2                             values((k-1)*m+j,:)=lF.minus(values((k-1)*m+j,:),lF.mult(values((i-1)*m+j,:),values((k-1)*m+i,:)));                         end                         values{(i-1)*m+j,1}=0;                         values{(i-1)*m+j,2}=[1 1];                     end                 else                     break                 end             end             y=[];             y.m=m;             y.n=m;             y.values=values(m*m+(1:m*m),:);             y=validate(y);         end      end  lM=[]; lM.zeros=@zeros; lM.ones=@ones; lM.neg=@neg; lM.inv=@inv; end     


长多项式类型,存到 longPoly.m

       function lP=longPoly(lF)     function y=validate(x)         maxP=max(max(x.power));         [m,n]=size(x.power);         weight1=zeros(m,1);         for i=1:n             weight1=weight1+x.power(:,i)*(maxP+1)^i;         end         [~,idx1]=sort(weight1);         y=[];         y.coeff=cell(m,2);         y.power=zeros(m,n);         i=1;         power0=zeros(1,n)-1;         coeff0={0,[1 1]};         for j=1:m             if sum(power0==x.power(idx1(j),:))==n                 coeff0=lF.add(coeff0,x.coeff(idx1(j),:));                 y.coeff(i,:)=coeff0;             else                 if numel(coeff0{1})>1                     i=i+1;                 end                 power0=x.power(idx1(j),:);                 coeff0=x.coeff(idx1(j),:);                 y.power(i,:)=power0;                 y.coeff(i,:)=coeff0;             end         end         if i==1 && numel(y.coeff{1})==1             y.power=0;             y.coeff={0,[1 1]};         elseif numel(coeff0{1})==1             y.coeff=y.coeff(1:i-1,:);             y.power=y.power(1:i-1,:);         else             y.coeff=y.coeff(1:i,:);             y.power=y.power(1:i,:);         end     end     function y=new(coeff,nVar,power)         y=[];         y.coeff=coeff;         y.power=zeros(1,max(nVar,1));         y.power(1,max(nVar,1))=power;     end     function y=display(x)         if sum(sum(abs(x.power)))==0             y='0';         else             [m,n]=size(x.power);             maxL1=0;             maxL2=0;             coeff=cell(m,1);             power=cell(m,1);             for i=1:m                 coeff{i}=lF.display(x.coeff(i,:));                 if numel(coeff{i})>maxL1                     maxL1=numel(coeff{i});                 end                 power{i}='';                 flag1=0;                 for j=1:n                     if x.power(i,j)>1                         if flag1                             power{i}=[power{i} '*'];                         end                                                     flag1=1;                         power{i}=[power{i} 'a'+j-1 '^' num2str(x.power(i,j))];                     elseif x.power(i,j)>0                         if flag1                             power{i}=[power{i} '*'];                         end                                                     flag1=1;                         power{i}=[power{i} 'a'+j-1];                                           end                 end                 if numel(power{i})>maxL2                     maxL2=numel(power{i});                 end             end             y=zeros(m,maxL1+maxL2)+' ';             for i=1:m                 if numel(power{i})==0                     y(i,1:numel(coeff{i}))=coeff{i};                 elseif numel(coeff{i})==2 && coeff{i}(2)=='1'                     y(i,1)=coeff{i}(1);                     y(i,2:numel(power{i})+1)=power{i};                 else                     y(i,1)=coeff{i}(1);                     y(i,2:numel(power{i})+1)=power{i};                     y(i,numel(power{i})+2)='*';                     y(i,numel(power{i})+1+(2:numel(coeff{i})))=coeff{i}(2:end);                 end             end          end         y=char(y);     end     function y=neg(x)         y=x;         [m,~]=size(x.power);         for i=1:m             y.coeff(i,:)=lF.neg(y.coeff(i,:));         end     end     function y=add(x1,x2)         y=[];         y.coeff=[x1.coeff;x2.coeff];         n1=size(x1.power,2);         n2=size(x2.power,2);         if n1>=n2             y.power=[x1.power;x2.power x2.power(:,1)*zeros(1,n1-n2)];         else             y.power=[x1.power x1.power(:,1)*zeros(1,n2-n1);x2.power];         end         y=validate(y);     end     function y=add3(x1,x2,x3)         y=add(add(x1,x2),x3);     end     function y=add4(x1,x2,x3,x4)         y=add(add3(x1,x2,x3),x4);     end     function y=add5(x1,x2,x3,x5)         y=add(add4(x1,x2,x3,x4),x5);     end     function y=minus(x1,x2)         y=add(x1,neg(x2));     end     function y=mult(x1,x2)         y=[];         [m1,n1]=size(x1.power);         [m2,n2]=size(x2.power);         m=m1*m2;         n=max(n1,n2);         y.coeff=cell(m,2);         y.power=zeros(m,n);         for i=1:m1             for j=1:m2                 idx1=(i-1)*m2+j;                 y.coeff(idx1,:)=lF.mult(x1.coeff(i,:),x2.coeff(j,:));                 y.power(idx1,1:n1)=x1.power(i,:);                 y.power(idx1,1:n2)=y.power(idx1,1:n2)+x2.power(j,:);             end         end         y=validate(y);     end     function y=mult3(x1,x2,x3)         y=mult(mult(x1,x2),x3);     end     function y=mult4(x1,x2,x3,x4)         y=mult(mult3(x1,x2,x3),x4);     end     function y=mult5(x1,x2,x3,x4,x5)         y=mult(mult4(x1,x2,x3,x4),x5);     end     function y=subset(x1,idx1)         y=[];         y.coeff=x1.coeff(idx1,:);         y.power=x1.power(idx1,:);     end     function y=diff(x1,n)         y=x1;         [m,~]=size(x1.power);         for i=1:m             if y.power(i,n)>0                 y.coeff(i,:)=lF.mult({[1 y.power(i,n)],[1 1]},y.coeff(i,:));                 y.power(i,n)=y.power(i,n)-1;             else                 y.coeff(i,:)={0,[1 1]};                 y.power(i,:)=0;             end         end          y=validate(y);     end     function y=subtitConst(x1,varNo,values)         y=x1;         [m,~]=size(x1.power);         for i=1:m             for j=1:numel(varNo)                 for k=1:y.power(i,varNo(j))                     y.coeff(i,:)=lF.mult(y.coeff(i,:),values(j,:));                 end                 y.power(i,varNo(j))=0;             end         end         y=validate(y);     end     function y=subtitPoly(x1,varNo,poly1)         flag1=1;         if size(poly1.power,2)>=varNo             if sum(poly1.power(:,varNo)~=0)>1                 flag1=0;                 y=NaN;             end         end         if flag1             idx1=find(x1.power(:,varNo)==0);             y=subset(x1,idx1);             idx1=find(x1.power(:,varNo)~=0);             for i=1:numel(idx1)                 x2=subset(x1,idx1(i));                 x2.power(1,varNo)=0;                 for j=1:x1.power(idx1(i),varNo)                     x2=mult(x2,poly1);                 end                 y=add(y,x2);             end         end         y=validate(y);     end     function [q,r]=div(x1,x2,varOrder) %x2 highest order only constant coefficient          [m1,n1]=size(x1.power);         [m2,n2]=size(x2.power);         n=max(n1,n2);          if ~exist('varOrder','var')             varOrder=(n:-1:1).^2;%:-1:1;         else             varOrder=varOrder.^2;         end         r=x1;         x22=x2;         if n1<n             r.power=[r.power zeros(m1,n-n1)];         end         if n2<n             x22.power=[x22.power zeros(m2,n-n2)];         end         weight2=sum(x22.power,2)*(n+1)^3+x22.power*varOrder';         [~,idx2]=sort(weight2,'descend');         x22.power=x22.power(idx2,:);         x22.coeff=x22.coeff(idx2,:);         q=lP.new({0,[1 1]},0,0); %y=new(coeff,nVar,power)         if m2==1 && numel(x22.coeff{1,1})==1             q=NaN;             r=NaN;         else             flag1=1;              while flag1                 power=r.power-ones(m1,1)*x22.power(1,:);                 weight1=sum(power,2)*(n+1)^3+power*varOrder';                 [~,idx1]=max(weight1-(sum(power>=0,2)<n)*max(abs(weight1))*1000);                 power=power(idx1,:);                 if sum(power>=0)==n                      coeff=lF.div(r.coeff(idx1,:),x22.coeff(1,:));                     poly1=[];                     poly1.coeff=coeff;                     poly1.power=power;                     q=lP.add(q,poly1);                     poly2=lP.mult(x22,poly1);                     r=lP.minus(r,poly2);                     [m1,~]=size(r.power);                 else                     flag1=0;                 end             end             q=validate(q);             r=validate(r);         end     end lP.new=@new; lP.display=@display; lP.validate=@validate; lP.neg=@neg; lP.add=@add; lP.add3=@add3; lP.add4=@add4; lP.add5=@add5; lP.minus=@minus; lP.mult=@mult; lP.mult3=@mult3; lP.mult4=@mult4; lP.mult5=@mult5; lP.subset=@subset; lP.diff=@diff; lP.subtitConst=@subtitConst; lP.subtitPoly=@subtitPoly; lP.div=@div; end     

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有