tsujimotter.hatenablog.com
この記事を読んで合同数を求めてみようと思った。
ja.wikipedia.org
Wikipediaをさらりと読んで参考にせずぺぺっと書いて動かしてみた
コード(C#)
using System; using System.Collections.Generic; namespace ConsoleApp2 { class Program { static void Main() { Edge a = new Edge(); Edge b = new Edge(); Edge c = new Edge(); List<long> congruum = new List<long>(); for (int s = 1; s < 100; s++) { for (a.m = 1; a.m <= 100; a.m++) { for (a.c = 1; a.c <= 100; a.c++) { //面積を求める式を変形して辺bを求める b.c = 2 * s * a.m; b.m = a.c; if (CalcEdge(a, b, c) == true) { if (congruum.Contains(s) == false) { Console.WriteLine($"{a.c}/{a.m}, {b.c}/{b.m}, {c.c}/{c.m}, {s}"); congruum.Add(s); } } } } } congruum.Sort(); foreach (var item in congruum) { Console.WriteLine(item); } } private static bool CalcEdge(Edge a, Edge b, Edge c) { //斜辺の長さを求める計算 var cu = a.c * a.c * b.m * b.m + b.c * b.c * a.m * a.m; var mu = a.m * a.m * b.m * b.m; //2乗の値になっているのでルートを取る c.c = (long)(Math.Sqrt(cu)); c.m = (long)(Math.Sqrt(mu)); //ルートをとった結果が整数か long cf = cu - c.c * c.c; long mf = mu - c.m * c.m; return (cf == 0 & mf == 0); } } public class Edge { //分母と分子 public long m; public long c; } }
出力
3/2, 20/3, 41/6, 5
3/1, 12/3, 15/3, 6
24/5, 70/24, 674/120, 7
21/2, 56/21, 455/42, 14
4/1, 30/4, 34/4, 15
3/1, 40/3, 41/3, 20
12/1, 42/12, 150/12, 21
33/35, 1540/33, 53911/1155, 22
6/1, 48/6, 60/6, 24
48/5, 280/48, 2696/240, 28
5/1, 60/5, 65/5, 30
24/1, 68/24, 580/24, 34
5/2, 156/5, 313/10, 39
40/3, 246/40, 1762/120, 41
20/1, 90/20, 410/20, 45
9/1, 108/9, 135/9, 54
21/1, 112/21, 455/21, 56
8/1, 120/8, 136/8, 60
35/4, 504/35, 2359/140, 63
12/1, 130/12, 194/12, 65
15/1, 140/15, 265/15, 70
45/1, 156/45, 2031/45, 78
6/1, 160/6, 164/6, 80
7/1, 168/7, 175/7, 84
77/6, 1020/77, 8521/462, 85
66/35, 6160/66, 215644/2310, 88
12/1, 192/12, 240/12, 965
6
7
14
15
20
21
22
24
28
30
34
39
41
45
54
56
60
63
65
70
78
80
84
85
88
96
歯抜け状態だけど合同数になるものは出力されてる。