wayne 发表于 2010-6-10 16:12:52

无心人 发表于 2010-6-10 16:18:10

Prelude> let p3 n = [((0, 0), (x1, y1), (x2, y2))|(x1, y1)<- pn n, (x2, y2)<-p n
, (x1, y1)/=(x2, y2), x2^2 + y2^2 + (x1-x2)^2 + (y1-y2)^2 == n^2, x2>=y2]
强约束下5果然就2组解

无心人 发表于 2010-6-10 16:20:04

Prelude> let a = [(x, y)| x<- , let y = length (p3 x)]
Prelude> a
[(2,1),(3,0),(4,1),(5,2),(6,1),(7,0),(8,1),(9,0),(10,6),(11,0),(12,1),(13,2),(14
,1),(15,2),(16,1),(17,3),(18,1),(19,0),(20,6),(21,0),(22,1),(23,0),(24,1),(25,7)
,(26,6),(27,0),(28,1),(29,3),(30,6),(31,0),(32,1),(33,0),(34,6),(35,2),(36,1),(3
7,3),(38,1),(39,2),(40,6),(41,2),(42,1),(43,0),(44,1),(45,2),(46,1),(47,0),(48,1
),(49,0),(50,15),(51,3),(52,6),(53,3),(54,1),(55,2),(56,1),(57,0),(58,6),(59,0),
(60,6),(61,2),(62,1),(63,0),(64,1),(65,21),(66,1),(67,0),(68,6),(69,0),(70,6),(7
1,0),(72,1),(73,3),(74,6),(75,7),(76,1),(77,0),(78,6),(79,0),(80,6),(81,0),(82,6
),(83,0),(84,1),(85,20),(86,1),(87,3),(88,1),(89,2),(90,6),(91,2),(92,1),(93,0),
(94,1),(95,2),(96,1),(97,2),(98,1),(99,0),(100,15)]
对应解个数如上

无心人 发表于 2010-6-10 16:23:39

不对。上面想法不对,等我重新考虑下吧
但是可以确定10以内,2,4,6,8确实是只有1组解的,5本质上有2组,如果不考虑变换,有3组

无心人 发表于 2010-6-10 16:25:23

修改约束如下
一个原点O
一个点A(x1, y1),处于(0, 0) - (n, n)直线的下方,X轴以上,即要求x1 >= y1
一个点B(x2, y2),处于直线OA上方,即 y2 / x2 > y1 / x1
且,要求B在OA的中垂线右边(该条待验证)

无心人 发表于 2010-6-10 17:56:25

rInt :: String -> IO Int
rInt = readIO

above (x1, y1) (x2, y2) | (x1 == 0) && (x2 == 0) = y2 > y1
                        | (x1 == 0) && (x2 /= 0) = y2 > 0
                        | (x1 /= 0) && (x2 == 0) = y2 > 0
                        | (x1 /= 0) && (x2 /= 0) = y2 * x1 > y1 * x2


p n = [(x, y)|x<-, y<- , (x/=0)||(y/=0)]

pn n =filter (\(x, y) ->(x <= y) && (x^2 + y^2 == n^2)) (p n)

p3 n = [((0, 0), (x1, y1), (x2, y2))|(x1, y1)<- pn n, (x2, y2)<-p n, (x1, y1)/=(x2, y2), x2^2 + y2^2 + (x1-x2)^2 + (y1-y2)^2== n^2, above (x1, y1) (x2, y2)]

main = do
            print "Input n: "
            s <- getLine
            n <- rInt s
            print \$ p3 n
            print \$ length (p3 n)

暂时就到这个地步吧

无心人 发表于 2010-6-10 17:59:45

对应的编译成可执行程序的文件

mathe 发表于 2010-6-11 09:03:18

其实就是将$n^2=X^2+Y^2$的所有非负整数解进行变换
首先,对于任意n,我们可以将其在分解为欧拉素数的乘积,由此可以得出$n^2=X^2+Y^2$的所有解
比如,$30=2*3*5=3(1+i)(1-i)(2+i)(2-i)$
所以$30^2=3^2(1+i)^2(1-i)^2(2+i)^2(2-i)^2$
然后根据上面表达式,我们可以将$30^2$写成两个共轭数的乘积,比如$30^2=(3(1+i)^2(2+i)^2)(3(1-i)^2(2-i)^2)$,通常形式就是$n^2=(X+Yi)(X-Yi)$就可以了

wayne 发表于 2010-6-11 15:26:23

可以给出 解的个数 的一般性的分析吗

wayne 发表于 2010-6-11 15:30:56

47# 无心人


代码直接复制黏贴到GHCi里面执行出错了
页: 1 2 3 4 [5] 6 7 8 9
查看完整版本: 整点直角三角形