функция Haskell: pytri
, которую я написал, представляет собой понимание, которое принимает целое значение n
в качестве входных данных и возвращает список всех троек (a, b, c) с a, b, c ≤ n
которые удовлетворяют теореме Пифагора: a2 = b2 + c2:
pytri :: Integer -> [(Integer,Integer,Integer)]
pytri n = [(a,b,c)| a <- [1..n],b<-[1..n],c<-[1..n], a^2+b^2==c^2 ]
Однако он содержит все перестановки этих троек, например:
pytri 10 == [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]
Но вместо этого должно быть:
pytri 10 == [(5,4,3),(10,8,6)]
Как я могу удалить дополнительную перестановку и отсортировать их внутри по убыванию?
Вам следует заняться нарушением симметрии. Поскольку мы знаем, что b и c всегда можно поменять местами, мы нарушаем симметрию дополнительным ограничением a≤b:
pytri :: Integer -> [(Integer,Integer,Integer)]
pytri n = [(a,b,c)| a <- [1..n], b <- [a..n],c<-[1..n], a*a+b*b==c*c ]
мы также можем легко ограничить поиск c
, повысив эффективность:
pytri :: Integer -> [(Integer,Integer,Integer)]
pytri n = [(a,b,c)| a <- [1..n], b <- [a..n],c<-[b..n], a*a+b*b==c*c ]
Мы можем использовать дополнительные трюки, чтобы более эффективно искать c
и ограничивать «пространство», в котором мы ищем a
и b
, я оставляю это в качестве упражнения.