一般matlab里给出的gcd(a,b)函数求最大公约数只能有两个参数,如果输入gcd(1,2,3)就会出现出现如下错误:
所以如果求多个数的最大公约数就会出现问题,下面程序是对任意多个数求最大公约数:
function [maxgcd]=maxgcd(A)
n=length(A);
maxgcd=A(1);
for i=1:1:(n-1)
maxgcd=gcd(maxgcd,A(i+1));
end
end
例如求4,8,12,24的最大公约数为:
除了求最大公约数,有时候也要求多个数的最小公倍数:
function [min_GBS]=min_GBS(A)
n=length(A);
maxA=max(A);
s=1;
k=0;
for i=1:1:n
s=s*A(i);
end
fla=false;
for i=maxA:1:s
for j=1:1:n
if(mod(i,A(j))==0)
fla=true;
k=i;
else
fla=false;
break;
end
end
if(fla==true)
min_GBS=k;
return;
end
end
end
例如求4,8,12,16的最小公倍数就是48.
当然,我们在处理一些数据的时候有时候需要把分数化成整数,比如把多项式1/2*x^2+x+1/5化成整系数的形式:
5*x^2+10*x+2,且系数为互质的形式,此时需要求多个非整型的数据的“最小公倍数”:
function [min_double_GBS]=min_doub_GBS(A)
n=length(A);
% f_on=sym([]);
f_down=sym([]);
char fla=false;
for i=1:1:n
[~,f_down(i)]=numden(sym(A(i)));
end
% f_down
for i=1:1:n
if(f_down(i)~=1)
fla=false;
break;
else
fla=true;
end
end
if(fla==false)
GBS=min_GBS(f_down);
B=GBS*A;
min_double_GBS=min_GBS(B);
else
min_double_GBS=min_GBS(A);
end
% if(maxgcd(A)~=1)
% min_double_GBS
for i=1:1:n
A(i)=min_double_GBS/A(i);
end
% A
if(maxgcd(A)~=1)
d=maxgcd(A);
min_double_GBS=min_double_GBS/d;
end
end
注意:这个函数是需要调用上面两个函数的!
例如求1,1/2,3的“最小公倍数”为3,分别是乘以3,6,1
再例如求1,2/5,3的“最小公倍数”为6,分别是乘以6,15,2