0
$\begingroup$

I have this code for evaluating some fractions:

fmax = 100;
Do[
 If[GCD[f, g, h] != 1, Continue[]];
 If[Mod[f^2 + g^2 + h^2, f g + g h + h f] == 0, Print[(f g+g h+h f)/(f^2+g^2+h^2)]],
 {f, fmax}, {g, f + 1, fmax + 1}, {h, g + 1, fmax + 2}
 ]

However, I want to stop it from evaluating the same fraction twice (there are a lot of $\frac{1}{2}$'s appearing, but I only need one of each possible fraction).

Is there an easy way to modify the code to do this?

If not, how can I just make sure that NO $\frac{1}{2}$'s appear. That would be just as helpful if you can show me how to do it.

Thanks!

$\endgroup$
3
$\begingroup$
l = Flatten[ Table[{i, j, k}, {i, 100}, {j, i + 1, 101}, {k, j + 1, 102}], 2];
l1 = Select[l,GCD @@ # == 1 && Mod[Norm[#]^2, Tr[Times @@@ Subsets[#, {2}]]] == 0 &];
DeleteDuplicates[Tr[Times @@@ Subsets[#, {2}]]/Norm[#]^2 & /@ l1]

(* {1/2, 1/14, 1/10, 1/5} *)
$\endgroup$
  • $\begingroup$ This is great, thanks! $\endgroup$ – user45220 Feb 9 '15 at 19:01
3
$\begingroup$

Pretty simple, although maybe not obvious in this kind of code: Use Memoization. Here, you could just use your own version of print which redefines itself after it has printed a fraction and does nothing anymore:

print[frac_] := (Print[frac]; print[frac] = Null);

fmax = 100;
Do[If[GCD[f, g, h] != 1, Continue[]];
 If[Mod[f^2 + g^2 + h^2, f g + g h + h f] == 0, 
  print[(f g + g h + h f)/(f^2 + g^2 + h^2)]], {f, fmax}, {g, f + 1, 
  fmax + 1}, {h, g + 1, fmax + 2}]

Mathematica graphics

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.