Можно без перебора всех вариантов стразу получать искомые IP-адреса - если идти не от чисел, а от суммы цифр каждого числа.
В результате скрипт, в котором echo было заменено на ++$count, проработал менее 14 секунд и насчитал 112279695 адресов.
$tbl = array_fill(0, 20, []);
for ($i = 0; $i < 256; ++$i) { $tbl[intdiv($i, 100) + intdiv($i, 10) % 10 + $i % 10][] = $i; }
for ($i = 0; $i <= 19; ++$i) {
for ($j = 0; $j <= min(19, 28 - $i); ++$j) {
for ($k = max(0, 28 - 19 - $i - $j); $k <= min(19, 28 - $i - $j); ++$k) {
foreach($tbl[$i] as $v1) {
foreach($tbl[$j] as $v2) {
foreach($tbl[$k] as $v3) {
foreach($tbl[28 - $i - $j - $k] as $v4) {
echo $v1, '.', $v2, '.', $v3, '.', $v4, "\n";
}
}
}
}
}
}
}
Сумма цифр числа в диапазоне 0..255 имеет диапазон значений от 0 (0) до 19 (199).
$tbl - массив списков чисел в диапазоне 0..255, имеющих одинаковую сумму цифр.