Advertisement
Guest User

Untitled

a guest
Aug 24th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.07 KB | None | 0 0
  1. import Data.List
  2. import Data.Function
  3. import Data.Array
  4. import Data.Maybe
  5. -- все множители данного числа
  6. factors:: Int -> [Int]
  7.  
  8. factors n = [x | x <- [2..n], n `mod` x==0]
  9.  
  10. -- сколько раз в разложении на множители участвует данный множитель
  11. count_factors:: Int -> Int -> Int
  12.  
  13. count_factors n m
  14. | n `mod` m /= 0 = 0
  15. | otherwise = 1 + (count_factors (n `div` m) m)
  16.  
  17. -- разложение на простые множители
  18. prime_factor:: Int -> [(Int,Int)]
  19.  
  20. prime_factor 1 = []
  21.  
  22. -- неоптимально, надо бы переделать
  23. prime_factor n = [(x,y)] ++ prime_factor (n `div` (x^y))
  24. where x = head (factors n)
  25. y = count_factors n x
  26.  
  27. -- получаем вторые элементы кортежей списка
  28. get_seconds = map snd
  29. get_first = map fst
  30.  
  31. -- последовательность всех возможных степеней
  32. get_seq list = [first] ++ next_seq first list
  33. where first = map (\_ -> 0) list
  34.  
  35. -- следующая последовательность (надо как-то оптимизировать через
  36. -- произведение множеств)
  37. next_seq::[Int]->[Int]->[[Int]]
  38. next_seq first list
  39. | first == list = []
  40. | head first < head list = [([(head first)+1] ++ (tail first))] ++ next_seq ([(head first)+1] ++ (tail first)) list
  41. | otherwise = [([0] ++ head (next_seq (tail first) (tail list)))] ++
  42. (next_seq ([0] ++ head (next_seq (tail first) (tail list))) list)
  43.  
  44. -- все разложение перебираются без повторений
  45. divisors:: [Int]->Int->[[[Int]]]
  46. divisors n 1 = [[n]]
  47. divisors n m = filter (\x -> head x<=head (tail x)) [[x]++y|x <- get_seq n,y<-divisors (n `minus` x) (m-1)]
  48.  
  49. -- вычитание последовательностей
  50. minus::[Int]->[Int]->[Int]
  51. minus [n] [x] = [n-x]
  52. minus (n:n1) (x:x1) = [n-x] ++ (minus n1 x1)
  53.  
  54. powerlist [] [] = 1
  55. powerlist (n:n1) (m:m1) = (n^m)*(powerlist n1 m1)
  56.  
  57. -- разбиение на множители числа n на m множителей
  58. factor n m = map (map (\(x,y) -> powerlist x y)) $ map (map (\x -> (primes,x))) (divisors powers m)
  59. where factors = prime_factor n
  60. powers = get_seconds factors
  61. primes = get_first factors
  62.  
  63. search_repeat [] = False
  64. search_repeat [_] = False
  65. search_repeat (n:n1)
  66. | n==(head n1) = True
  67. | otherwise = search_repeat n1
  68.  
  69. -- заменяем сортировку на массив
  70.  
  71. array_count2 [] start = start
  72. array_count2 (n:n1) start = array_count2 n1 (start//[(snd n,x++[fst n])])
  73. where x=start!(snd n)
  74.  
  75.  
  76. array_count list =
  77. array_count2 list start
  78.  
  79. where m = maximum $ map snd list
  80. start = array (1,m) [(i,[])|i<-[1..m]]
  81.  
  82.  
  83.  
  84. exper n m = find (\x -> (length x)>1) $ elems $ array_count (map (\x -> (x,sum x)) $ factor n m)
  85.  
  86. exper_big n m = filter (\x -> (all (\y -> (all (\z -> z/=1) y)) x)) $ map fromJust $ filter (\x -> isJust x) [exper x m | x<-[2..n]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement