Elixir で約数のリストを返す

任意の「正の整数」値を渡し、その値の「約数のリスト」を返す関数をElixirで作成してみた。
Elixirの「1.9.0」で動作確認済み。

```elixir
yks = fn x -> v = x; 1..v |> Enum.filter(fn n -> rem(v, n) == 0 end) end
```

以下、処理内容。

 * 引数 **x** の値を **v** に代入
 * 1..**v** で、1から最大値 **v** までの**Range**を作成し、パイプ演算子で **Enum.filter/2**に渡す
 * **Enum.filter/2**内の関数では、引数 **n** を 剰余を求める関数 **rem/2** で 「*rem(v,n) == 0*」 になった値だけを残す

課題としては、以下がある。

 * 引数が「正の整数値」以外の考慮がない
 * 引数に渡す値が大きくなれば、処理時間がかかるようになる

課題については、必要になったら考える。

次に、動作確認をしてみる。

```
iex> yks.(10)
[1, 2, 5, 10]
iex> yks.(25)
[1, 5, 25]
iex> yks.(50)
[1, 2, 5, 10, 25, 50]
iex> yks.(75)
[1, 3, 5, 15, 25, 75]
iex> yks.(100)
[1, 2, 4, 5, 10, 20, 25, 50, 100]
```

動き自体は大丈夫そうなので、今度は1から100の値を投入してみる。
ここで、どの値が分かりやすいように、約数のリストは逆順に並べておく。
リストの逆順は、**Enum.reverse/1** で実施する。

```elixir
1..100 |> Enum.map(yks) |> Enum.map(fn r -> Enum.reverse(r) end)
```

以下、実行結果。

```elixir
[
  [1],
  [2, 1],
  [3, 1],
  [4, 2, 1],
  [5, 1],
  [6, 3, 2, 1],
  [7, 1],
  [8, 4, 2, 1],
  [9, 3, 1],
  [10, 5, 2, 1],
  [11, 1],
  [12, 6, 4, 3, 2, 1],
  [13, 1],
  [14, 7, 2, 1],
  [15, 5, 3, 1],
  [16, 8, 4, 2, 1],
  [17, 1],
  [18, 9, 6, 3, 2, 1],
  [19, 1],
  [20, 10, 5, 4, 2, 1],
〜（以下略）〜
```

## おまけ1: 約数の「数」を算出する場合

各要素数のリストを対象として、**Enum.reduce/3** で単純に個数をカウントする。

```elixir
yss = fn p -> Enum.reduce(p, 0, fn(_, acc) -> acc + 1 end) end
1..100 |> Enum.map(yks) |> Enum.map(yss)
```

以下、実行結果。

```elixir
[1, 2, 2, 3, 2, 4, 2, 4, 3, 4, 2, 6, 2, 4, 4, 5, 2, 6, 2, 6, 4, 4, 2, 8, 3, 4,
 4, 6, 2, 8, 2, 6, 4, 4, 4, 9, 2, 4, 4, 8, 2, 8, 2, 6, 6, 4, 2, 10, 3, 6, ...]
```

## おまけ2: 1から100までの約数一覧

1から100までの約数の一覧パターンを乗せておく。

 * :key が正の整数値
 * :list が約数の一覧
 * :yososu が要素の数


```elixir
1..100 |>
Enum.map(yks) |>
Enum.map(fn r -> Enum.reverse(r) end) |>
Enum.map( fn [h | t] -> %{:key =>h, :yososu => yss.([h|t]) , :list => [h | t]} end)
```

以下、実行結果。

```elixir
[
  %{key: 1, list: [1], yososu: 1},
  %{key: 2, list: [2, 1], yososu: 2},
  %{key: 3, list: [3, 1], yososu: 2},
  %{key: 4, list: [4, 2, 1], yososu: 3},
  %{key: 5, list: [5, 1], yososu: 2},
  %{key: 6, list: [6, 3, 2, 1], yososu: 4},
  %{key: 7, list: [7, 1], yososu: 2},
  %{key: 8, list: [8, 4, 2, 1], yososu: 4},
  %{key: 9, list: [9, 3, 1], yososu: 3},
  %{key: 10, list: [10, 5, 2, 1], yososu: 4},
  %{key: 11, list: [11, 1], yososu: 2},
  %{key: 12, list: [12, 6, 4, 3, 2, 1], yososu: 6},
  %{key: 13, list: [13, 1], yososu: 2},
  %{key: 14, list: [14, 7, 2, 1], yososu: 4},
  %{key: 15, list: [15, 5, 3, 1], yososu: 4},
  %{key: 16, list: [16, 8, 4, 2, 1], yososu: 5},
  %{key: 17, list: [17, 1], yososu: 2},
  %{key: 18, list: [18, 9, 6, 3, 2, 1], yososu: 6},
  %{key: 19, list: [19, 1], yososu: 2},
  %{key: 20, list: [20, 10, 5, 4, 2, 1], yososu: 6},
  %{key: 21, list: [21, 7, 3, 1], yososu: 4},
  %{key: 22, list: [22, 11, 2, 1], yososu: 4},
  %{key: 23, list: [23, 1], yososu: 2},
  %{key: 24, list: [24, 12, 8, 6, 4, 3, 2, 1], yososu: 8},
  %{key: 25, list: [25, 5, 1], yososu: 3},
  %{key: 26, list: [26, 13, 2, 1], yososu: 4},
  %{key: 27, list: [27, 9, 3, 1], yososu: 4},
  %{key: 28, list: [28, 14, 7, 4, 2, 1], yososu: 6},
  %{key: 29, list: [29, 1], yososu: 2},
  %{key: 30, list: [30, 15, 10, 6, 5, 3, 2, 1], yososu: 8},
  %{key: 31, list: [31, 1], yososu: 2},
  %{key: 32, list: [32, 16, 8, 4, 2, 1], yososu: 6},
  %{key: 33, list: [33, 11, 3, 1], yososu: 4},
  %{key: 34, list: [34, 17, 2, 1], yososu: 4},
  %{key: 35, list: [35, 7, 5, 1], yososu: 4},
  %{key: 36, list: [36, 18, 12, 9, 6, 4, 3, 2, 1], yososu: 9},
  %{key: 37, list: [37, 1], yososu: 2},
  %{key: 38, list: [38, 19, 2, 1], yososu: 4},
  %{key: 39, list: [39, 13, 3, 1], yososu: 4},
  %{key: 40, list: [40, 20, 10, 8, 5, 4, 2, 1], yososu: 8},
  %{key: 41, list: [41, 1], yososu: 2},
  %{key: 42, list: [42, 21, 14, 7, 6, 3, 2, 1], yososu: 8},
  %{key: 43, list: [43, 1], yososu: 2},
  %{key: 44, list: [44, 22, 11, 4, 2, 1], yososu: 6},
  %{key: 45, list: [45, 15, 9, 5, 3, 1], yososu: 6},
  %{key: 46, list: [46, 23, 2, 1], yososu: 4},
  %{key: 47, list: [47, 1], yososu: 2},
  %{key: 48, list: [48, 24, 16, 12, 8, 6, 4, 3, 2, 1], yososu: 10},
  %{key: 49, list: [49, 7, 1], yososu: 3},
  %{key: 50, list: [50, 25, 10, 5, 2, 1], yososu: 6},
  %{key: 51, list: [51, 17, 3, 1], yososu: 4},
  %{key: 52, list: [52, 26, 13, 4, 2, 1], yososu: 6},
  %{key: 53, list: [53, 1], yososu: 2},
  %{key: 54, list: [54, 27, 18, 9, 6, 3, 2, 1], yososu: 8},
  %{key: 55, list: [55, 11, 5, 1], yososu: 4},
  %{key: 56, list: [56, 28, 14, 8, 7, 4, 2, 1], yososu: 8},
  %{key: 57, list: [57, 19, 3, 1], yososu: 4},
  %{key: 58, list: [58, 29, 2, 1], yososu: 4},
  %{key: 59, list: [59, 1], yososu: 2},
  %{key: 60, list: [60, 30, 20, 15, 12, 10, 6, 5, 4, 3, 2, 1], yososu: 12},
  %{key: 61, list: [61, 1], yososu: 2},
  %{key: 62, list: [62, 31, 2, 1], yososu: 4},
  %{key: 63, list: [63, 21, 9, 7, 3, 1], yososu: 6},
  %{key: 64, list: [64, 32, 16, 8, 4, 2, 1], yososu: 7},
  %{key: 65, list: [65, 13, 5, 1], yososu: 4},
  %{key: 66, list: [66, 33, 22, 11, 6, 3, 2, 1], yososu: 8},
  %{key: 67, list: [67, 1], yososu: 2},
  %{key: 68, list: [68, 34, 17, 4, 2, 1], yososu: 6},
  %{key: 69, list: [69, 23, 3, 1], yososu: 4},
  %{key: 70, list: [70, 35, 14, 10, 7, 5, 2, 1], yososu: 8},
  %{key: 71, list: [71, 1], yososu: 2},
  %{key: 72, list: [72, 36, 24, 18, 12, 9, 8, 6, 4, 3, 2, 1], yososu: 12},
  %{key: 73, list: [73, 1], yososu: 2},
  %{key: 74, list: [74, 37, 2, 1], yososu: 4},
  %{key: 75, list: [75, 25, 15, 5, 3, 1], yososu: 6},
  %{key: 76, list: [76, 38, 19, 4, 2, 1], yososu: 6},
  %{key: 77, list: [77, 11, 7, 1], yososu: 4},
  %{key: 78, list: [78, 39, 26, 13, 6, 3, 2, 1], yososu: 8},
  %{key: 79, list: [79, 1], yososu: 2},
  %{key: 80, list: [80, 40, 20, 16, 10, 8, 5, 4, 2, 1], yososu: 10},
  %{key: 81, list: [81, 27, 9, 3, 1], yososu: 5},
  %{key: 82, list: [82, 41, 2, 1], yososu: 4},
  %{key: 83, list: [83, 1], yososu: 2},
  %{key: 84, list: [84, 42, 28, 21, 14, 12, 7, 6, 4, 3, 2, 1], yososu: 12},
  %{key: 85, list: [85, 17, 5, 1], yososu: 4},
  %{key: 86, list: [86, 43, 2, 1], yososu: 4},
  %{key: 87, list: [87, 29, 3, 1], yososu: 4},
  %{key: 88, list: [88, 44, 22, 11, 8, 4, 2, 1], yososu: 8},
  %{key: 89, list: [89, 1], yososu: 2},
  %{key: 90, list: [90, 45, 30, 18, 15, 10, 9, 6, 5, 3, 2, 1], yososu: 12},
  %{key: 91, list: [91, 13, 7, 1], yososu: 4},
  %{key: 92, list: [92, 46, 23, 4, 2, 1], yososu: 6},
  %{key: 93, list: [93, 31, 3, 1], yososu: 4},
  %{key: 94, list: [94, 47, 2, 1], yososu: 4},
  %{key: 95, list: [95, 19, 5, 1], yososu: 4},
  %{key: 96, list: [96, 48, 32, 24, 16, 12, 8, 6, 4, 3, 2, 1], yososu: 12},
  %{key: 97, list: [97, 1], yososu: 2},
  %{key: 98, list: [98, 49, 14, 7, 2, 1], yososu: 6},
  %{key: 99, list: [99, 33, 11, 9, 3, 1], yososu: 6},
  %{key: 100, list: [100, 50, 25, 20, 10, 5, 4, 2, 1], yososu: 9}
]
```