По-моему, нет нужды проверять, простой ли делитель. Смотри, мы проверяем делители от 2 до sqrt(N).
Это значит, что если у числа есть составной делитель, то мы сначала наткнёмся на делители этого составного делителя. Тогда мы можем их устранить простым алгоритмом.
Обрати внимание, делители храним не в списке, а в множестве (set), чтобы избежать двойных включений.
1. Берём проверяемое число N, создаём пустой набор делителей. Принимаем последний множитель K = 2.
2. Пока N > 1:
3. Цикл по i от K до корня из N
4. Если N делится на i, то i - делитель. Тогда
5. Принимаем K = i, делим N нацело на i, добавляем i в набор найденных делителей, прерываем цикл 3.
6. Если цикл 3. не был прерван, то текущее N - простое. Добавляем N в набор делителей, прерываем цикл 2.
7. Возвращаем построенный набор делителей.
Таким образом мы постепенно "устраняем" простые делители, от меньших к большим, пока число само не станет простым.
А дальше просто, в цикле от 10001 до 50001 выполняем алгоритм выше.
Также можно оптимизировать программу, заставив цикл 3 перебирать не все числа до корня из N, а заранее вычисленный список простых чисел до заданного максимального N. Но и без этого работает быстро.