int(n**0.5)
- это значение пола sqrt (n), которое вы путаете с мощностью 2 из n (n**2)
. Если n
является не простым, то должно быть два числа 1 < i <= j < n
такие, что: i * j = n
.
Теперь, поскольку sqrt(n) * sqrt(n) = n
, предполагая, что один из i,j
больше (или равен) sqrt(n)
- это означает, что другой должен быть меньше (или равен) sqrt(n)
.
Так как это так, достаточно для повторения целых чисел в диапазоне [2, sqrt(n)]
. И это именно тот код, который был опубликован.
Если вы хотите выйти в качестве реального смартфона, используйте следующую однострочную функцию:
import re
def is_prime(n):
return not re.match(r'^1?$|^(11+?)\1+$',n*'1')
Объяснение для «магического регулярного выражения» можно найти здесь
Предполагая, что этот класс
class MyEntity
{
//...
public IList<int> Integers { get; private set; }
}
Просто сопоставьте его как набор.
<class name="MyEntity">
<!-- ... -->
<set name="Integers" table="MyEntity_Integers">
<key column="MyEntity_FK"/>
<element type="Int32" column="Value"/>
</set>
</class>
Вы можете попробовать отфильтровать коллекцию по:
from MyEntity e
where e.Integers in (:set)
and size(e.Integers) = :setSize
Это, вероятно, не очень быстро.
Совершенно другой подход: хранить целые числа в некоторой сериализованной форме в одном текстовом поле.
Вы можете написать свой собственный пользовательский тип NHibernate. Перед сохранением отсортируйте целые числа. Вы можете сохранить их в таком формате, как «2; 45; 78; 898»
. Фильтрация будет очень быстрой, потому что она просто соответствует строке. Изменить коллекцию в базе данных может быть сложно. Другая проблема в том, что длина столбца ограничена.
Вот пример реализации пользовательского типа NHibernate.