找回密码
 欢迎注册
楼主: TSC999

[讨论] 最小的三同整数四边形对

[复制链接]
 楼主| 发表于 2017-4-28 21:55:43 | 显示全部楼层
本帖最后由 TSC999 于 2017-4-28 21:56 编辑

由 0-1110 网友找到的更小的整边等腰梯形:(周长为 226)

更小的整边梯形.png

点评

还有更小的没有?  发表于 2017-4-28 22:37
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-4-30 20:24:55 | 显示全部楼层
Perimeter:60, Area:150, SumOfDiagonal:38
        AB:11,BC:14,CD:15,DA:20, BD:13
        AB:15,BC:20,CD:21,DA:4, BD:13
Perimeter:60, Area:150, SumOfDiagonal:37
        AB:8,BC:12,CD:25,DA:15, BD:17
        AB:9,BC:16,CD:20,DA:15, BD:12
Perimeter:80, Area:300, SumOfDiagonal:50
        AB:11,BC:14,CD:25,DA:30, BD:25
        AB:15,BC:15,CD:25,DA:25, BD:20
Perimeter:84, Area:336, SumOfDiagonal:53
        AB:11,BC:17,CD:26,DA:30, BD:25
        AB:3,BC:25,CD:30,DA:26, BD:25
Perimeter:108, Area:504, SumOfDiagonal:67
        AB:17,BC:25,CD:40,DA:26, BD:25
        AB:3,BC:39,CD:40,DA:26, BD:25
Perimeter:120, Area:600, SumOfDiagonal:75
        AB:25,BC:25,CD:40,DA:30, BD:25
        AB:11,BC:39,CD:40,DA:30, BD:25
Perimeter:120, Area:600, SumOfDiagonal:76
        AB:22,BC:28,CD:30,DA:40, BD:26
        AB:30,BC:40,CD:42,DA:8, BD:26
Perimeter:90, Area:300, SumOfDiagonal:55
        AB:11,BC:14,CD:40,DA:25, BD:30
        AB:20,BC:20,CD:25,DA:25, BD:15
Perimeter:100, Area:360, SumOfDiagonal:54
        AB:13,BC:13,CD:37,DA:37, BD:30
        AB:6,BC:25,CD:40,DA:29, BD:25
Perimeter:120, Area:600, SumOfDiagonal:74
        AB:16,BC:24,CD:50,DA:30, BD:34
        AB:18,BC:32,CD:40,DA:30, BD:24
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-4-30 20:30:09 | 显示全部楼层
上面好像包含四边形退化为三角形的情况,去除上面的情况可以得出:
Perimeter:100, Area:360, SumOfDiagonal:54
        AB:13,BC:13,CD:37,DA:37, BD:30
        AB:6,BC:25,CD:40,DA:29, BD:25
Perimeter:200, Area:1440, SumOfDiagonal:108
        AB:26,BC:26,CD:74,DA:74, BD:60
        AB:12,BC:50,CD:80,DA:58, BD:50
Perimeter:252, Area:1890, SumOfDiagonal:126
        AB:26,BC:35,CD:100,DA:91, BD:75
        AB:36,BC:51,CD:90,DA:75, BD:51
Perimeter:226, Area:2700, SumOfDiagonal:150
        AB:32,BC:53,CD:88,DA:53, BD:75
        AB:13,BC:68,CD:77,DA:68, BD:75
Perimeter:276, Area:4092, SumOfDiagonal:187
        AB:50,BC:76,CD:105,DA:45, BD:85
        AB:26,BC:80,CD:85,DA:85, BD:85

Perimeter:300, Area:3240, SumOfDiagonal:162
        AB:39,BC:39,CD:111,DA:111, BD:90
        AB:18,BC:75,CD:120,DA:87, BD:75
Perimeter:276, Area:4092, SumOfDiagonal:187
        AB:45,BC:50,CD:76,DA:105, BD:102
        AB:26,BC:80,CD:85,DA:85, BD:85

Perimeter:400, Area:5760, SumOfDiagonal:216
        AB:52,BC:52,CD:148,DA:148, BD:120
        AB:24,BC:100,CD:160,DA:116, BD:100
Perimeter:314, Area:4200, SumOfDiagonal:250
        AB:108,BC:37,CD:132,DA:37, BD:125
        AB:122,BC:57,CD:122,DA:13, BD:125
Perimeter:394, Area:9408, SumOfDiagonal:280
        AB:99,BC:85,CD:125,DA:85, BD:140
        AB:113,BC:99,CD:113,DA:69, BD:140
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-4-30 22:37:55 | 显示全部楼层
对于上面那组红色数据画图——

周长 276 的四边形对.png

四边形面积计算:

  1. a = 102; b = 76; c = 50; a1 = 102; b1 = 105; c1 = 45;
  2. s1 = 1/4 Sqrt[(a^2 + b^2 + c^2)^2 - 2 (a^4 + b^4 + c^4)] +
  3.   1/4 Sqrt[(a1^2 + b1^2 + c1^2)^2 - 2 (a1^4 + b1^4 + c1^4)]

  4. a = 85; b = 85; c = 26; a1 = 85; b1 = 85; c1 = 80;
  5. s2 = 1/4 Sqrt[(a^2 + b^2 + c^2)^2 - 2 (a^4 + b^4 + c^4)] +
  6.   1/4 Sqrt[(a1^2 + b1^2 + c1^2)^2 - 2 (a1^4 + b1^4 + c1^4)]
复制代码


面积均为 4092。

点评

四边形面积等于两个三角形面积之和。上述程序中使用的三角形面积公式为改进后的秦九韶公式。秦九韶公式不够优美,因为秦九韶公式对于三条边的表述不对称。改进后的公式是对称的,这公式是网友李明波发现的。  发表于 2017-4-30 22:46
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-4-30 22:51:10 | 显示全部楼层
谢谢 mathe 的例子,确实给出了周长和面积更小的、非等腰梯形的甲乙四边形对。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-5-1 07:03:42 来自手机 | 显示全部楼层
第一组周长100更小,是最小的解。红色解只是和前面一个重复了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-5-1 09:30:54 | 显示全部楼层
这是搜索用的代码
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <map>
  4. #include <vector>
  5. #define MAX_ERR 0.00001
  6. #define MAX_DIAG 300
  7. using namespace std;
  8. typedef struct _two_edges{
  9.     int i;
  10.     int j;
  11. }two_edges;
  12. typedef vector<two_edges> two_edges_set;
  13. typedef struct _quadrilateral{
  14.     int a,b,c,d;
  15.     int diagonal;
  16. }quadrilateral;

  17. typedef struct _resultql{
  18.     int perimeter;
  19.     int area;
  20.     int sumdiag;
  21.     bool operator<(const struct _resultql& ql)const{
  22.         if(perimeter<ql.perimeter)return true;
  23.         if(perimeter>ql.perimeter)return false;
  24.         if(area<ql.area)return true;
  25.         if(area>ql.area)return false;
  26.         return sumdiag<ql.sumdiag;
  27.     }
  28. }resultql;
  29. typedef map<resultql, quadrilateral> result_map;
  30. double getaera(int a, int b, int c)
  31. {
  32.      double ss=a+b+c;
  33.      ss*=a+b-c;
  34.      ss*=a-b+c;
  35.      ss*=b+c-a;
  36.      return sqrt(ss)/4.0;
  37. }

  38. double getA(int a, int b, int c)
  39. {
  40.      double ss=b*b+c*c-a*a;
  41.      ss/=2*b*c;
  42.      if(ss>1.0)ss=1.0;if(ss<-1.0)ss=-1.0;
  43.      return acos(ss);
  44. }

  45. double get_c(int a, int b, double C)
  46. {
  47.     double ss=a*a+b*b-2*a*b*cos(C);
  48.     return sqrt(ss);
  49. }

  50. void list_triange_of_max_edge(int e, two_edges_set& result)
  51. {
  52.     int i,j;
  53.     result.clear();
  54.     for(i=1;i<=MAX_DIAG;i++){
  55.        int s=e-i+1;
  56.        int d=e+i-1;
  57.        if(s<i)s=i;
  58.        if(d>=MAX_DIAG-i)d=MAX_DIAG-i;
  59.        for(j=s;j<=d;j++){
  60.             double s=4.0*getaera(e,i,j);
  61.             if(fabs(s-round(s))<MAX_ERR){//found a candidate triangle
  62.                 two_edges es;
  63.                 es.i=i;es.j=j;
  64.                 result.push_back(es);
  65.             }
  66.        }
  67.     }
  68. }

  69. void put_result(result_map& result, const resultql& ql, const quadrilateral& q)
  70. {
  71.     result_map::iterator it=result.find(ql);
  72.     if(it==result.end()){
  73.         result.insert(make_pair(ql, q));
  74.     }else{
  75.         const quadrilateral& q2=it->second;
  76.         if(q2.a==q.b&&q2.b==q.c&&q2.c==q.d&&q2.d==q.a)
  77.             return;
  78.         if(q2.a==q.d&&q2.b==q.a&&q2.c==q.b&&q2.d==q.c)
  79.             return;
  80.         if(q2.a==q.c&&q2.b==q.b&&q2.c==q.a&&q2.d==q.d)
  81.             return;
  82.         if(q2.a==q.a&&q2.b==q.d&&q2.c==q.c&&q2.d==q.b)
  83.             return;
  84.         printf("Perimeter:%d, Area:%d, SumOfDiagonal:%d\n", ql.perimeter, ql.area, ql.sumdiag);
  85.         printf("\tAB:%d,BC:%d,CD:%d,DA:%d, BD:%d\n",q.a,q.b,q.c,q.d,q.diagonal);
  86.         printf("\tAB:%d,BC:%d,CD:%d,DA:%d, BD:%d\n",q2.a,q2.b,q2.c,q2.d, q2.diagonal);
  87.     }
  88. }

  89. void list_result_map(int diag, result_map& result)
  90. {
  91.      two_edges_set es;
  92.      list_triange_of_max_edge(diag, es);
  93.      int count = es.size();
  94.      int i,j;
  95.      for(i=0;i<count;++i){
  96.          double s1=getaera(diag, es[i].i, es[i].j);
  97.          double A1 = getA(es[i].j, diag, es[i].i);
  98.          double A2 = getA(es[i].i, diag, es[i].j);
  99.          for(j=i; j<count; ++j){
  100.              double s2=getaera(diag, es[j].i, es[j].j);
  101.              if(fabs(s1+s2-round(s1+s2))>=MAX_ERR)continue;//The sum of two triangle must be integer
  102.              double B1 = getA(es[j].j, diag, es[j].i);
  103.              double c1 = get_c(es[i].i, es[j].i, A1+B1);
  104.              if(fabs(c1-round(c1))<MAX_ERR){//found one result
  105.                 int d2=(int)round(c1);
  106.                 if(d2<es[i].i+es[j].i&&d2<es[i].j+es[j].j){
  107.                   resultql ql;
  108.                   ql.perimeter = es[i].i+es[i].j+es[j].i+es[j].j;
  109.                   ql.area = (int)round(s1+s2);
  110.                   ql.sumdiag = diag+(int)round(c1);
  111.                   quadrilateral q;
  112.                   q.a=es[i].i;q.b=es[j].i;q.c=es[j].j;q.d=es[i].j;
  113.                   q.diagonal = diag;
  114.                   put_result(result, ql, q);
  115.                 }
  116.              }
  117.              if(es[i].i==es[i].j)continue;
  118.              if(es[j].i==es[j].j)continue;
  119.              double c2 = get_c(es[i].j, es[j].i, A2+B1);
  120.              if(fabs(c2-round(c2))<MAX_ERR){//found one result
  121.                 int d2=(int)round(c2);
  122.                 if(d2<es[i].j+es[j].i&&d2<es[i].i+es[j].j){
  123.                   resultql ql;
  124.                   ql.perimeter = es[i].i+es[i].j+es[j].i+es[j].j;
  125.                   ql.area = (int)round(s1+s2);
  126.                   ql.sumdiag = diag+(int)round(c2);
  127.                   quadrilateral q;
  128.                   q.a=es[i].j;q.b=es[j].i;q.c=es[j].j;q.d=es[i].i;
  129.                   q.diagonal = diag;
  130.                   put_result(result, ql, q);
  131.                 }
  132.              }
  133.          }
  134.      }
  135. }

  136. int main()
  137. {
  138.      int i;
  139.      result_map map;
  140.      for(i=3;i<=MAX_DIAG;i++){
  141.          list_result_map(i,map);
  142.      }
  143.      return 0;
  144. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-5-1 10:01:39 来自手机 | 显示全部楼层
不过找三个满足条件的四边形还是困难的,我的程序我把对角线长放大到5000也没有找到
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-5-1 13:50:01 | 显示全部楼层
我不太喜欢这种对称破缺的东东。看到这个题目,我宁愿替换成寻找两个“三组对边之和对应相等的整数完全四点形”。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-5-1 14:12:07 | 显示全部楼层
,对称破缺的话 基本上就进入程序员的领域了。 ,而非 纯数学所能解决的了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-19 21:21 , Processed in 0.045503 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表