How to obtain a list of random integers satisfying the Law of Cosine?

NaviKan (view profile)

on 21 Sep 2019 at 13:31
Latest activity Edited by Bruno Luong

Bruno Luong (view profile)

on 23 Sep 2019 at 12:25
Accepted Answer by Image Analyst

Image Analyst (view profile)

Hello everyone,
Can anybody help me in obtaining random integers, “a”, “b” and “c” ranging from 0 to 100, which satisfy the Law of Cosine c^2=a^2+b^2+a*b, for the fixed corresponding angle equals 120 degrees.

darova

darova (view profile)

on 21 Sep 2019 at 13:41
Can you show what you have tried?
John D'Errico

John D'Errico (view profile)

on 21 Sep 2019 at 14:05
Not hard, but an interesting homework assignment, but surely your homework. If you want help, then make an effort. Show how you might try to solve it, and then you might get help.

Tags

Answer by Image Analyst

Image Analyst (view profile)

on 21 Sep 2019 at 14:44

So I guess the triple nested for loop won't work because they need to be obtained from a random draw and not sequentially? Have you heard of the randi() function?
Do you have to find them ALL? Since to make sure you've tested them all, and you're using randi() instead of a triple-for-loop, you're going to have to ask for lots of them. Let's see, a 100x100x100 would take a million test, so taking them randomly might take a few hundred million, which is certainly within MATLAB's power. Then use a single for loop to test them all
N = 200000000; % or whatever.
r = randi(..........
for k = 1 : N
if r(1) + ....................do the test
end

Bruno Luong

Bruno Luong (view profile)

on 23 Sep 2019 at 6:20
I don't think you need to check gcd(b,c)~=1, it is redundant to gcd(a,b)~=1.
For the record here is the code generate 14 primitive triples (brute force)
a=1:100;
b=(1:100)';
c=sqrt(a.^2+b.^2+a.*b);
[j,i,c]=find(mod(c,1)==0 & c<=100 & bsxfun(@gcd,a,b)==1);
abc=unique(sort([a(i)',b(j),c],2),'rows')
EDIT: optimization following Guillaume's suggestion
Guillaume

Guillaume (view profile)

on 23 Sep 2019 at 9:22
Note that you can do:
[j, i, c] = find(mod(c,1)==0 & c<=100);
a = a(i)'; b = b(j);
No need for the ind2sub.
Bruno Luong

Bruno Luong (view profile)

on 23 Sep 2019 at 9:29
Thanks Guillaume.