我正在尝试制作一个程序,用于评估3个数字(基数)的gcd,以及base1
和base2
,base2
和{{1}的GCD }},base3
和base3
都等于1,然后将基数推广到范围内的指数。基本上,我需要做的是弄清楚他们的GCD是否等于1,然后计算数字到权力。这就是它的样子:
base1
现在,我已尝试使用可怕的bases = 150
powers = 150
base1 = all numbers 1-bases
base2 = all numbers 1-bases
base3 = all numbers 1-bases
if the GCD of all combinations = 1
do base1^all numbers 3-powers
do base2^all numbers 3-powers
do base2^all numbers 3-powers
then store all of those in an array
循环,但它非常慢,我不认为它是一个解决方案。只有当基数和功率为10或更低时,它才能快速起作用。如何在不使用for
循环的情况下执行此操作?或者,如果我必须使用for
循环,我该如何减少使用的数量?我能计算出3个GCD组合中的数字是1吗?我尝试过的for
循环如下:
for
答案 0 :(得分:3)
我认为这个问题可以通过以下方式解决,如下所示
%Generate all possible triplets.
[x1,x2,x3]=ndgrid(1:3,1:3,1:3);
v=[x1(:) x2(:) x3(:)];
现在定义一个匿名函数。
gcd3_test=@(a,b,c)(gcd(a,b)==1 & gcd(b,c)==1 & gcd(a,c)==1)
gcdTest=gcd3_test(v(:,1),v(:,2),v(:,3));
v=v(gcdTest,:);
同样为所有权力生成三元组。
[x1,x2,x3]=ndgrid(3:10,3:10,3:10);
p=[x1(:) x2(:) x3(:)];
然后我想你必须使用for循环(但只有一个):
重要提示:我假设您为权限for
运行3:150
循环,并且您需要存储所有x,y,z
,那么您将需要大量内存(35034 GB,即使是单个精确)。你没有在你的代码中这样做。
所以不要尝试以下循环。
%DO NOT RUN
for i=1:size(v,1)
vReplicated=repmat(v(i,:),size(p,1),1);
v_RaisedTo_P{i}=vReplicated.^p;
end
注意:观察您在进行GCD测试时不关心顺序(即if
条件。所以我认为您可以过滤掉很多三胞胎,但这会影响您的功率计算。< / p>
allTriplets=sort(allTriplets,2);
allTriplets=unique(allTriplets,'rows'); %27 triplets reduce to 10
答案 1 :(得分:0)
代码表明你已经实现了两个整数的gcd或你使用了内置? gcd(a,b,c)等于gcd(a,gcd(b,c))
gcd3=@(a,b,c)(gcd(a,gcd(b,c)))