{"id":312881,"date":"2020-11-10T09:00:55","date_gmt":"2020-11-10T09:00:55","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=312881"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=312881","title":{"rendered":"\u0418\u0449\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0437\u0430 \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044c \u043c\u0438\u043d\u0443\u0442"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/tz\/df\/dw\/tzdfdwbfqcejvbysekihfbrzrce.png\" alt=\"image\"><\/p>\n<p>  \u041f\u043e\u0438\u0441\u043a \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u2014 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432, \u0443\u0432\u043b\u0435\u043a\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439. \u0421\u0430\u043c\u044b\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439, \u043f\u043e-\u0432\u0438\u0434\u0438\u043c\u043e\u043c\u0443, \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445 \u0442\u044b\u0441\u044f\u0447 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434, \u2014 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B5%D1%88%D0%B5%D1%82%D0%BE_%D0%AD%D1%80%D0%B0%D1%82%D0%BE%D1%81%D1%84%D0%B5%D0%BD%D0%B0\" rel=\"nofollow\">\u0440\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430<\/a>; \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u0435\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0435\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439. <br \/>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 C#, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u2014 \u0440\u0435\u0448\u0435\u0442\u0430 \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430, \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u0430 \u0438 \u0410\u0442\u043a\u0438\u043d\u0430, \u0438 \u043a\u043e\u043d\u0447\u0430\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 (\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f). \u041e\u0441\u043e\u0431\u044b\u0439 \u0443\u043f\u043e\u0440 \u044f \u0434\u0435\u043b\u0430\u043b \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443: \u0441\u0430\u043c\u044b\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438\u0437 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 120 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u0438 \u0438\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0437\u0430 30 \u043c\u0438\u043d\u0443\u0442, \u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430 \u2014 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0437\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 (\u044d\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043e\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043b\u0443\u0447\u0448\u0438\u0445 \u0438\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043f\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043d\u043e \u044d\u0442\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u0432\u044b\u0448\u0435 4000 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430).<br \/>  \u0412 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0441\u0430\u043c\u0443\u044e \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0434\u043e \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430. \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442, \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u043c \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0443\u0433\u0430\u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442. \u0414\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0434\u043e 100 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e 8 (\u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 89 \u0438 97), \u0430 \u0434\u043e \u0442\u044b\u0441\u044f\u0447\u0438 \u2014 20 (\u043c\u0435\u0436\u0434\u0443 887 \u0438 907).<br \/>  \u0412\u0435\u0441\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/lightln2\/Primes\" rel=\"nofollow\">\u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435<\/a>.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>1. \u0420\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430<\/h2>\n<p>  <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B5%D1%88%D0%B5%D1%82%D0%BE_%D0%AD%D1%80%D0%B0%D1%82%D0%BE%D1%81%D1%84%D0%B5%D0%BD%D0%B0\" rel=\"nofollow\">\u0420\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430<\/a> \u2014 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0415\u0433\u043e \u0441\u0443\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c:<br \/>   \u2014 \u0412\u044b\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u0430 2, 3, &#8230;, N;<br \/>   \u2014 \u0411\u0435\u0440\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b2b\/43c\/7aa\/b2b43c7aa38ceb7d564b395d52ca474d.svg\" alt=\"$p=2$\" data-tex=\"inline\"><\/math> \u0438 \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u043c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435 \u0447\u0438\u0441\u043b\u0430, \u043a\u0440\u0430\u0442\u043d\u044b\u0435 \u0435\u043c\u0443, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e54\/94f\/b78\/e5494fb7834c36d0265d160228fc1887.svg\" alt=\"$p^2$\" data-tex=\"inline\"><\/math>: 4, 6, 8,\u2026<br \/>   \u2014 \u0411\u0435\u0440\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/111\/5d6\/e24\/1115d6e24ef20d5a36a98f96863c47be.svg\" alt=\"$p=3$\" data-tex=\"inline\"><\/math> \u0438 \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u043c \u043a\u0440\u0430\u0442\u043d\u044b\u0435 \u0435\u043c\u0443 9, 15,\u2026<br \/>   \u2014 \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0438\u0437 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/250\/305\/72d\/25030572df15579c6896f449a7de9c2b.svg\" alt=\"$p=5, 7, 11, ...,$\" data-tex=\"inline\"><\/math> \u043f\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/416\/e05\/c0d\/416e05c0d8e662403c390d0371d4b311.svg\" alt=\"$p^2 &lt;= \\sqrt{N}$\" data-tex=\"inline\"><\/math>; \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0447\u0438\u0441\u043b\u0430 \u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438:<br \/>  <code>\u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u043c \u043a\u0440\u0430\u0442\u043d\u044b\u0435 2: [<b>2<\/b>, 3,<s> 4<\/s>, 5,<s> 6<\/s>, 7,<s> 8<\/s>, 9,<s> 10<\/s>, 11,<s> 12<\/s>, 13,<s> 14<\/s>, 15, ...]<br \/>  \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u043c \u043a\u0440\u0430\u0442\u043d\u044b\u0435 3: [2, <b>3<\/b>, 5, 7,<s> 9<\/s>, 11, 13,<s> 15<\/s>, 17, 19,<s> 21<\/s>, 23, 25,<s> 27<\/s>, ...]<br \/>  \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u043c \u043a\u0440\u0430\u0442\u043d\u044b\u0435 5: [2, 3, <b>5<\/b>, 7, 11, 13, 17, 19, 23,<s> 25<\/s>, 29, 31,<s> 35<\/s>, ...]<br \/>  \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435...<\/code><br \/>  \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b N, \u0441 \u0432\u0441\u0435\u043c\u0438 \u0431\u0438\u0442\u0430\u043c\u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 1, \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0431\u0438\u0442 \u043d\u0430 0.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">SieveOfEratosthenes.cs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class SieveOfEratosthenes : ISieve {     private BitArray Data;     public int Length =&gt; Data.Length;      public SieveOfEratosthenes(int length)     {         Data = new BitArray(length);         Data.SetAll(true);          for (int p = 2; p * p &lt; length; p++)         {             if (Data[p])             {                 for (int i = p * p; i &lt; Length; i += p)                 {                     Data[i] = false;                 }             }         }     }      public void ListPrimes(Action&lt;long&gt; callback)     {         for (int i = 2; i &lt; Length; i++)         {             if (Data[i]) callback.Invoke(i);         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043c\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 ISieve, \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434:  <\/p>\n<pre><code class=\"cs\">public interface ISieve {     void ListPrimes(Action&lt;long&gt; callback); } <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u043a\u043e\u043b\u0431\u0435\u043a\u043e\u0432, \u0430 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u0434\u043b\u044f C# \u044d\u043d\u0443\u043c\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u043d\u0430 10-40% \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u042d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439; \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e, \u0441\u0443\u043c\u043c\u0443 \u0438 \u0445\u0435\u0448 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430:  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">PerformanceTests<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">static void TestSieve&lt;T&gt;(long length,                           long expectedCount,                          long expectedSum,                          long expectedHash) {     var sw = Stopwatch.StartNew();     ISieve sieve = CreateSieve&lt;T&gt;(length);     long count = 0, sum = 0, hash = 0;     Action&lt;long&gt; action = (p) =&gt; { count++; sum += p; hash = hash * 31 + p; };     sieve.ListPrimes(action);     AssertEquals(expectedCount, count);     AssertEquals(expectedSum, sum);     AssertEquals(expectedHash, hash);     Console.WriteLine($&quot;{typeof(T).Name} up to {length:N0} in {sw.Elapsed}&quot;); }  static void TestSieve_1G&lt;T&gt;() =&gt;     TestSieve&lt;T&gt;(1_000_000_000, 50847534, 24739512092254535, 1480810120364005255); <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c: <b>\u0440\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430<\/b><br \/>  \u0418\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430: <b>12.6 \u0441\u0435\u043a\u0443\u043d\u0434<\/b>.<\/p>\n<h2>2. \u0420\u0435\u0448\u0435\u0442\u043e \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u0430<\/h2>\n<p>  <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B5%D1%88%D0%B5%D1%82%D0%BE_%D0%A1%D1%83%D0%BD%D0%B4%D0%B0%D1%80%D0%B0%D0%BC%D0%B0\" rel=\"nofollow\">\u0420\u0435\u0448\u0435\u0442\u043e \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u0430<\/a> \u2014 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u043c \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u043c \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u043e\u043c \u0432 1934 \u0433\u043e\u0434\u0443. \u0415\u0433\u043e \u0441\u0443\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0438 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0447\u0438\u0441\u0435\u043b \u043e\u0442 1 \u0434\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9cf\/855\/d89\/9cf855d8975cf18529adb6a19eaf2ffa.svg\" alt=\"$(N-1)\/2$\" data-tex=\"inline\"><\/math> \u0432\u0441\u0435\u0445 \u0447\u0438\u0441\u0435\u043b \u0432\u0438\u0434\u0430 <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/841\/d93\/a37\/841d93a375cd4058394422ec1af6674a.svg\" alt=\"$i+j+2ij$\" data-tex=\"display\"><\/math><\/p>\n<\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/072\/160\/2b9\/0721602b9a82216dbaed83e67da24820.svg\" alt=\"$1&lt;=i&lt;=j$\" data-tex=\"display\"><\/math><\/p>\n<p> \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u0434\u043b\u044f \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0447\u0438\u0441\u0435\u043b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/766\/de2\/baa\/766de2baaaba439adbd21b6afaf044e1.svg\" alt=\"$n_i$\" data-tex=\"inline\"><\/math>, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0447\u0438\u0441\u0435\u043b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d83\/a71\/ae8\/d83a71ae87ee5c8cd1997a8dacf11fe0.svg\" alt=\"$2n_i+1$\" data-tex=\"inline\"><\/math> \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e N.<br \/>  <code>\u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u043c 1+j+2*1*j: [1, 2, 3,<s> 4<\/s>, 5, 6,<s> 7<\/s>, 8, 9,<s> 10<\/s>, ...]<br \/>  \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u043c 2+j+2*2*j: [1, 2, 3, 5, 6, 8, 9, 11,<s> 12<\/s>, 14, 15, ...]<br \/>  \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u043c 3+j+2*3*j: [1, 2, 3, 5, 6, 8, 9, 10, 11, 14, ...,<s> 24<\/s>, ...]<br \/>  \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435...<br \/>  \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 2n+1: [3, 5, 7, 11, 13, 17, 19, ...]<\/code>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">SieveOfSundaram.cs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class SieveOfSundaram : ISieve {     private BitArray Data;     public int Length { get; private set; }      public SieveOfSundaram(int length)     {         Length = length;         Data = new BitArray((Length + 1) \/ 2);         Data.SetAll(true);          for (int i = 1; i + i + 2 * i * i &lt; Data.Length; i++)         {             for (int j = i; i + j + 2 * i * j &lt; Data.Length; j++)             {                 Data[i + j + 2 * i * j] = false;             }         }     }      public void ListPrimes(Action&lt;long&gt; callback)     {         callback.Invoke(2);          for (int i = 1; i &lt; Data.Length; i++)         {             if (Data[i])             {                 int p = i * 2 + 1;                 if (p &gt;= Length) break;                 callback.Invoke(p);             }         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>   \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0440\u0435\u0448\u0435\u0442\u0430 \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u0430 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/aa1\/84d\/68d\/aa184d68d45155402576665ad494ecc3.svg\" alt=\"$(i, j)$\" data-tex=\"inline\"><\/math>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0445\u0443\u0436\u0435: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d81\/55e\/b26\/d8155eb26fbb060d2c4773c5fe611b9b.svg\" alt=\"$O(N logN)$\" data-tex=\"inline\"><\/math> \u043f\u0440\u043e\u0442\u0438\u0432 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/991\/e03\/e42\/991e03e4294f18077c979ba6334075fc.svg\" alt=\"$O(N log log N)$\" data-tex=\"inline\"><\/math>. \u0418 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0442\u0435\u0441\u0442\u0435 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0439:<\/p>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c: <b>\u0440\u0435\u0448\u0435\u0442\u043e \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u0430<\/b><br \/>  \u0418\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430: <b>18 \u0441\u0435\u043a\u0443\u043d\u0434<\/b>.<\/p>\n<h2>3. \u0420\u0435\u0448\u0435\u0442\u043e \u0410\u0442\u043a\u0438\u043d\u0430<\/h2>\n<p>  \u0412 2003 \u0433\u043e\u0434\u0443 \u0434\u0432\u0430 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u043e\u0440\u0430 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0438\u0437 \u0418\u043b\u043b\u0438\u043d\u043e\u0439\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 \u0432 \u0427\u0438\u043a\u0430\u0433\u043e \u0410\u0440\u0442\u0443\u0440 \u0410\u0442\u043a\u0438\u043d \u0438 \u0414\u0430\u043d\u0438\u044d\u043b\u044c \u0411\u0435\u0440\u043d\u0448\u0442\u0435\u0439\u043d \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044e, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u043e\u0432\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043e\u043f\u0438\u0440\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u0447\u0438\u0441\u0435\u043b. \u042d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043a\u0430\u043a <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B5%D1%88%D0%B5%D1%82%D0%BE_%D0%90%D1%82%D0%BA%D0%B8%D0%BD%D0%B0\" rel=\"nofollow\">\u0440\u0435\u0448\u0435\u0442\u043e \u0410\u0442\u043a\u0438\u043d\u0430<\/a>. \u0415\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c91\/e16\/261\/c91e16261b31e9a0e0bc698129f3e506.svg\" alt=\"$ax^2 + by^2 = n$\" data-tex=\"inline\"><\/math> \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/08d\/9fa\/efb\/08d9faefbe272bdf8fbb80773542e343.svg\" alt=\"$n$\" data-tex=\"inline\"><\/math>, \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u043d\u0435\u0447\u0435\u0442\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/08d\/9fa\/efb\/08d9faefbe272bdf8fbb80773542e343.svg\" alt=\"$n$\" data-tex=\"inline\"><\/math> \u2014 \u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435, \u043b\u0438\u0431\u043e \u0438\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e54\/94f\/b78\/e5494fb7834c36d0265d160228fc1887.svg\" alt=\"$p^2$\" data-tex=\"inline\"><\/math>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u0444\u043e\u0440\u043c \u043e\u0442\u0441\u0435\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u043d\u0435 \u0434\u0435\u043b\u044f\u0449\u0438\u0435\u0441\u044f \u043d\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u0442\u0443 \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430, \u043e\u0442\u0441\u0435\u0438\u0442\u044c \u043a\u0440\u0430\u0442\u043d\u044b\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. <br \/>  \u041f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 \u0438\u043c\u0435\u0435\u0442 \u0438\u0437\u044f\u0449\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a38\/eb6\/5b9\/a38eb65b9f6ccdff295a05433949b325.svg\" alt=\"$(x, y)$\" data-tex=\"inline\"><\/math>, \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0431\u0438\u0442 <b>\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0439<\/b>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432\u0441\u0435 \u0431\u0438\u0442\u044b \u0431\u044b\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432 0, \u0442\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0431\u0443\u0434\u0443\u0442 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0442\u044b, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u0447\u0435\u0442\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437, \u0442\u043e \u0435\u0441\u0442\u044c \u0431\u0438\u0442\u044b \u0434\u043b\u044f \u0442\u0435\u0445 \u0447\u0438\u0441\u0435\u043b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/08d\/9fa\/efb\/08d9faefbe272bdf8fbb80773542e343.svg\" alt=\"$n$\" data-tex=\"inline\"><\/math>, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0447\u0435\u0442\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439!<br \/>  \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/08d\/9fa\/efb\/08d9faefbe272bdf8fbb80773542e343.svg\" alt=\"$n$\" data-tex=\"inline\"><\/math>, \u043d\u0435 \u0434\u0435\u043b\u044f\u0449\u0438\u0435\u0441\u044f \u043d\u0430 2, 3, 5, \u0438 \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 60.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">SieveOfAtkin.cs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class SieveOfAtkin : ISieve {     private BitArray Data;     public int Length { get; private set; }      public SieveOfAtkin(int length)     {         Length = length;         Data = new BitArray(Length);         Data.SetAll(false);          SieveQuadForm1(Data);         SieveQuadForm2(Data);         SieveQuadForm3(Data);          for (int p = 7; p * p &lt;= length; p++)         {             if (Data[p])             {                 for (int i = p * p; i &lt; Length; i += p * p)                 {                     Data[i] = false;                 }             }         }      }      private void SieveQuadForm1(BitArray data)     {         for (int x = 1; 4 * x * x &lt; data.Length; x++)         {             for (int y = 1; 4 * x * x + y * y &lt; data.Length; y += 2)             {                 int n = 4 * x * x + y * y;                 int rem = n % 60;                 if (rem == 1 || rem == 13 || rem == 17 || rem == 29 ||                      rem == 37 || rem == 41 || rem == 49 || rem == 53)                 {                     data[n] = !data[n];                 }             }         }     }      private void SieveQuadForm2(BitArray data)     {         for (int x = 1; 3 * x * x &lt; data.Length; x += 2)         {             for (int y = 2; 3 * x * x + y * y &lt; data.Length; y += 2)             {                 int n = 3 * x * x + y * y;                 int rem = n % 60;                 if (rem == 7 || rem == 19 || rem == 31 || rem == 43)                 {                     data[n] = !data[n];                 }             }         }     }      private void SieveQuadForm3(BitArray data)     {         for (int x = 1; 2 * x * x &lt; data.Length; x++)         {             for (int y = x - 1; y &gt; 0; y -= 2)             {                 int n = 3 * x * x - y * y;                 if (n &gt;= data.Length) continue;                 int rem = n % 60;                 if (rem == 11 || rem == 23 || rem == 47 || rem == 59)                 {                     data[n] = !data[n];                 }             }         }     }      public void ListPrimes(Action&lt;long&gt; callback)     {         callback.Invoke(2);         callback.Invoke(3);         callback.Invoke(5);         for (int i = 7; i &lt; Length; i++)         {             if (Data[i])             {                 callback.Invoke(i);             }         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u042d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0440\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/11b\/bac\/909\/11bbac909816a3563f0b61feec7a26f4.svg\" alt=\"$O(N)$\" data-tex=\"inline\"><\/math> \u043f\u0440\u043e\u0442\u0438\u0432 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/991\/e03\/e42\/991e03e4294f18077c979ba6334075fc.svg\" alt=\"$O(N log log N)$\" data-tex=\"inline\"><\/math>, \u043d\u043e \u0437\u0430 \u0441\u0447\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u0442\u0443 \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430 \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439.<\/p>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c: <b>\u0440\u0435\u0448\u0435\u0442\u043e \u0410\u0442\u043a\u0438\u043d\u0430<\/b><br \/>  \u0418\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430: <b>11.4 \u0441\u0435\u043a\u0443\u043d\u0434<\/b>.<\/p>\n<h2>4. \u041a\u043e\u043b\u0451\u0441\u043d\u0430\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>  <a href=\"https:\/\/en.wikipedia.org\/wiki\/Wheel_factorization\" rel=\"nofollow\">\u041a\u043e\u043b\u0451\u0441\u043d\u0430\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/a> \u2014 \u0432\u0438\u0434 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0448\u0435\u0442\u0430 \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430, \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043b\u044e\u0431\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0431\u043e\u043b\u044c\u0448\u0435\u0435 6, \u0438\u043c\u0435\u0435\u0442 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 6 \u043b\u0438\u0431\u043e 1, \u043b\u0438\u0431\u043e 5: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/ce2\/c43\/af1\/ce2c43af1391057c396c62cfba790f11.svg\" alt=\"$p = 6k+1$\" data-tex=\"inline\"><\/math> \u0438\u043b\u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9bd\/04d\/32e\/9bd04d32eb16ca98a37093bdbe7d0173.svg\" alt=\"$p=6k+5$\" data-tex=\"inline\"><\/math>: \u043f\u0440\u0438 \u043b\u044e\u0431\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0441\u0442\u0430\u0442\u043a\u0430\u0445 \u0447\u0438\u0441\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043b\u0438\u0431\u043e \u043d\u0430 2, \u043b\u0438\u0431\u043e \u043d\u0430 3. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0431\u043e\u043b\u044c\u0448\u0435\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f55\/470\/707\/f5547070782236c9d7c9eb14162902fd.svg\" alt=\"$2*3*5=30$\" data-tex=\"inline\"><\/math>, \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u0437 8 \u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432 \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 30: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/ad2\/f7c\/e96\/ad2f7ce96e7c89dcc0755ac0334ae78d.svg\" alt=\"$(1, 7, 11, 13, 17, 19, 23, 29)$\" data-tex=\"inline\"><\/math>. \u0415\u0449\u0435 \u043e\u0434\u043d\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438: \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0438\u0442\u0430 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u0442\u0430 \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430 \u0438\u043b\u0438 0.5 \u0431\u0438\u0442 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u0442\u0430 \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u0430, \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0431\u0430\u0437\u043e\u0439 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/bee\/f17\/e82\/beef17e8246dd76c8e376ab85723b24c.svg\" alt=\"$(2, 3, 5)$\" data-tex=\"inline\"><\/math> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 0.27 \u0431\u0438\u0442 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c 30 \u0447\u0438\u0441\u0435\u043b \u0432 8 \u0431\u0438\u0442\u0430\u0445. \u041f\u0440\u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u043e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430 \u0441\u0447\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0412 <a href=\"https:\/\/habr.com\/ru\/post\/504598\/\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/a> \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u043d \u043d\u0435 \u0431\u044b\u043b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">Wheel235.cs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class Wheel235 : ISieve {     private static int[] BIT_TO_INDEX = new int[] { 1, 7, 11, 13, 17, 19, 23, 29 };      private static int[] INDEX_TO_BIT = new int[] {             -1, 0,             -1, -1, -1, -1, -1, 1,             -1, -1, -1, 2,             -1, 3,             -1, -1, -1, 4,             -1, 5,             -1, -1, -1, 6,             -1, -1, -1, -1, -1, 7,         };      private byte[] Data;     public long Length { get; private set; }      public Wheel235(long length)     {         Length = length;         Data = new byte[(length + 29) \/ 30];         for (long i = 0; i &lt; Data.Length; i++) Data[i] = byte.MaxValue;          for (long i = 7; i * i &lt; Length; i++)         {             if (!IsPrime(i)) continue;             for (long d = i * i; d &lt; Length; d += i) ClearPrime(d);         }     }      public bool IsPrime(long n)     {         if (n &gt;= Length) throw new ArgumentException(&quot;Number too big&quot;);         if (n &lt;= 5) return n == 2 || n == 3 || n == 5;         int bit = INDEX_TO_BIT[n % 30];         if (bit &lt; 0) return false;         return (Data[n \/ 30] &amp; (1 &lt;&lt; bit)) != 0;     }      private void ClearPrime(long n)     {         int bit = INDEX_TO_BIT[n % 30];         if (bit &lt; 0) return;         Data[n \/ 30] &amp;= (byte)~(1 &lt;&lt; bit);     }      public void ListPrimes(Action&lt;long&gt; callback)     {         callback.Invoke(2);         callback.Invoke(3);         callback.Invoke(5);          for (long position = 0; position &lt; Data.Length; position++)         {             for (int bit = 0; bit &lt; 8; bit++)             {                 if ((Data[position] &amp; (1 &lt;&lt; bit)) != 0)                 {                     long p = position * 30 + BIT_TO_INDEX[bit];                     if (p &lt;= 5) continue;                     if (p &gt;= Length) return;                     callback.Invoke(p);                 }             }         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c: <b>(2,3,5)-\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/b><br \/>  \u0418\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430: <b>9.6 \u0441\u0435\u043a\u0443\u043d\u0434<\/b>.<\/p>\n<h2>5. \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430<\/h2>\n<p>  \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0448\u0435\u0442\u0435 \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0447\u0438\u0441\u0435\u043b, \u0445\u043e\u0442\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u043a\u0440\u043e\u043c\u0435 \u0434\u0432\u043e\u0439\u043a\u0438, \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0447\u0435\u0442\u043d\u044b\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043c\u0430\u0441\u0441\u0438\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0438\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u0430\u043c. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0435\u0447\u0435\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/08d\/9fa\/efb\/08d9faefbe272bdf8fbb80773542e343.svg\" alt=\"$n$\" data-tex=\"inline\"><\/math> \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0431\u0438\u0442\u0435 \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/40b\/8fc\/32b\/40b8fc32b6fd5f03ec0b754560bd85a7.svg\" alt=\"$(n -1)\/2$\" data-tex=\"inline\"><\/math>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0438 \u0447\u0438\u0441\u0435\u043b, \u043a\u0440\u0430\u0442\u043d\u044b\u0445 \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/839\/f25\/c27\/839f25c2746382debd4f08ea25ad5ecf.svg\" alt=\"$p$\" data-tex=\"inline\"><\/math>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0447\u0435\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e2f\/111\/461\/e2f111461e8130b7ff9a040d834a81a3.svg\" alt=\"$p^2 + p, p^2 + 3p, p^2+5p, ...$\" data-tex=\"inline\"><\/math> \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/bff\/8cb\/0fe\/bff8cb0fe43fbca0697b29abe77ba132.svg\" alt=\"$p^2 + 2p, p^2+4p, p^2+6p, ...$\" data-tex=\"inline\"><\/math>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">OptimizedSieveOfEratosthenes.cs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class OptimizedSieveOfEratosthenes : ISieve {     private BitArray Data;     public int Length { get; private set; }      public OptimizedSieveOfEratosthenes(int length)     {         Length = length;         Data = new BitArray(Length \/ 2 + 1);         Data.SetAll(true);          int maxFactor = (int)Math.Sqrt(Length);          for (int p = 3; p &lt;= maxFactor; p += 2)         {             if (Data[p \/ 2])             {                 for (int i = p * p; i &lt; Length; i += 2 * p)                 {                     Data[i \/ 2] = false;                 }             }         }     }      public void ListPrimes(Action&lt;long&gt; callback)     {         callback.Invoke(2);          for (int i = 1; i &lt; Length \/ 2; i++)         {             if (Data[i])             {                 long p = i * 2 + 1;                 if (p &gt;= Length) break;                 callback.Invoke(p);             }         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u042d\u0442\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0432\u0443\u043a\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0438, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 0.5 \u0431\u0438\u0442\u0430 \u043d\u0430 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043a\u0430\u043a \u0438 \u0440\u0435\u0448\u0435\u0442\u043e \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u0430.<\/p>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c: <b>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430<\/b><br \/>  \u0418\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430: <b>6.6 \u0441\u0435\u043a\u0443\u043d\u0434<\/b>.<\/p>\n<h2>6. \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u0442\u043e \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u0430<\/h2>\n<p>  \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0440\u0435\u0448\u0435\u0442\u043e \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u0430. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/839\/f25\/c27\/839f25c2746382debd4f08ea25ad5ecf.svg\" alt=\"$p$\" data-tex=\"inline\"><\/math> \u0438 \u0442\u0430\u043c, \u0438 \u0442\u0430\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0431\u0438\u0442\u0435 \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/266\/082\/abc\/266082abc3d741248f9faf92aaf9b759.svg\" alt=\"$(p - 1)\/2$\" data-tex=\"inline\"><\/math>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0440\u0435\u0448\u0435\u0442\u043e \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u0430 \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u0430 \u0432\u0438\u0434\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/044\/160\/af2\/044160af248e39d75ca4579d039c6cda.svg\" alt=\"$n=i+j+2ij$\" data-tex=\"inline\"><\/math>. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1ac\/15c\/9d0\/1ac15c9d010407145a4f4642fb1307e8.svg\" alt=\"$2n+1=(2i+1)(2j+1),$\" data-tex=\"display\"><\/math><\/p>\n<p> \u0442\u043e \u0435\u0441\u0442\u044c, \u043e\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430\u0434 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u0431\u0438\u0442\u043e\u0432, \u0430 \u043d\u0435 \u043d\u0430\u0434 \u0441\u0430\u043c\u0438\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0438\u0434\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435: \u0440\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430 \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0441\u043b\u0430, \u043a\u0440\u0430\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u043c, \u0430 \u0440\u0435\u0448\u0435\u0442\u043e \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u0430 \u2014 \u043a\u0440\u0430\u0442\u043d\u044b\u0435 \u0432\u0441\u0435\u043c \u0447\u0438\u0441\u043b\u0430\u043c! \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0435\u0448\u0435\u0442\u0430 \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u0430 \u2014 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0447\u0438\u0441\u043b\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/bf8\/3b5\/32c\/bf83b532cd867d34004f8eded8c5c79a.svg\" alt=\"$i$\" data-tex=\"inline\"><\/math>, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/401\/3d9\/909\/4013d9909b0167b12e3ffaca538dfa2e.svg\" alt=\"$2i+1$\" data-tex=\"inline\"><\/math> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e:  <\/p>\n<pre><code class=\"cs\">    if (!Data[i]) continue; <\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 \u0442\u043e\u0442 \u043d\u0435\u0447\u0430\u0441\u0442\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043d\u043e \u0438 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0435\u0433\u043e \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u0434\u0435\u043b\u0430\u044f \u0435\u0433\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u0442\u0443 \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430:  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">OptimizedSieveOfSundaram.cs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class OptimizedSieveOfSundaram : ISieve {     private BitArray Data;     public int Length { get; private set; }      public OptimizedSieveOfSundaram(int length)     {         Length = length;         Data = new BitArray((Length + 1) \/ 2);         Data.SetAll(true);          for (int i = 1; i + i + 2 * i * i &lt; Data.Length; i++)         {             if (!Data[i]) continue;              for (int j = i; i + j + 2 * i * j &lt; Data.Length; j++)             {                 Data[i + j + 2 * i * j] = false;             }         }     }      public void ListPrimes(Action&lt;long&gt; callback)     {         callback.Invoke(2);          for (int i = 1; i &lt; Data.Length; i++)         {             if (Data[i])             {                 int p = i * 2 + 1;                 if (p &gt;= Length) break;                 callback.Invoke(p);             }         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c:<\/p>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c: <b>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u0442\u043e \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u0430<\/b><br \/>  \u0418\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430: <b>6.5 \u0441\u0435\u043a\u0443\u043d\u0434<\/b>.<\/p>\n<h2>7. \u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430<\/h2>\n<p>  \u0412\u0441\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u0432\u0435\u0441\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0434\u043e \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430, \u0440\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c 120 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438; \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0435\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 (\u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b) \u0431\u0435\u0433\u0430\u0435\u0442 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443, \u043d\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u0435\u0448\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<br \/>  \u0427\u0442\u043e\u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435, \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0434\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1e8\/0c3\/b30\/1e80c3b3087c0a57b68ad11261a9ec2b.svg\" alt=\"$N$\" data-tex=\"inline\"><\/math> \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c \u0447\u0438\u0441\u043b\u0430, \u043a\u0440\u0430\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u043c, \u043d\u0435 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u043c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a3b\/ac2\/1af\/a3bac21af8849a2981fd9d40234df512.svg\" alt=\"$\\sqrt{N}$\" data-tex=\"inline\"><\/math>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0439\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a3b\/ac2\/1af\/a3bac21af8849a2981fd9d40234df512.svg\" alt=\"$\\sqrt{N}$\" data-tex=\"inline\"><\/math>, \u0430 \u043f\u043e\u0442\u043e\u043c \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043e\u0442\u0440\u0435\u0437\u043e\u043a <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/03b\/75e\/d45\/03b75ed45740a8064cd904107a9dae7a.svg\" alt=\"$[2..N]$\" data-tex=\"inline\"><\/math> \u043d\u0430 \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u043e\u0442\u0440\u0435\u0437\u043a\u0438 (\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b), \u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c \u043a\u0440\u0430\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430, \u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/839\/f25\/c27\/839f25c2746382debd4f08ea25ad5ecf.svg\" alt=\"$p$\" data-tex=\"inline\"><\/math>, \u0432 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0438:  <\/p>\n<pre><code class=\"cs\">long first = p * p; if (first &lt; segmentStart) {     first += (segmentStart - first + p - 1) \/ p * p; }<\/code><\/pre>\n<p>  <code>\u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u043c \u043a\u0440\u0430\u0442\u043d\u044b\u0435 2: [<s> 80<\/s>, 81,<s> 82<\/s>, 83,<s> 84<\/s>, 85,<s> 86<\/s>, 87,<s> 88<\/s>, 89,<s> 90<\/s>]<br \/>  \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u043c \u043a\u0440\u0430\u0442\u043d\u044b\u0435 3: [<s> 81<\/s>, 83, 85,<s> 87<\/s>, 89]<br \/>  \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u043c \u043a\u0440\u0430\u0442\u043d\u044b\u0435 5: [83,<s> 85<\/s>, 89]<br \/>  \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u043c \u043a\u0440\u0430\u0442\u043d\u044b\u0435 7 (\u043d\u0435\u0442 \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435): [83, 89]<\/code><br \/>  \u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B5%D1%88%D0%B5%D1%82%D0%BE_%D0%AD%D1%80%D0%B0%D1%82%D0%BE%D1%81%D1%84%D0%B5%D0%BD%D0%B0#%D0%A1%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D1%80%D0%B5%D1%88%D0%B5%D1%82%D0%BE\" rel=\"nofollow\">\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u0442\u043e<\/a>, \u0438 \u0441 \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u043d\u0438\u0436\u0430\u044e\u0442\u0441\u044f \u0441 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/11b\/bac\/909\/11bbac909816a3563f0b61feec7a26f4.svg\" alt=\"$O(N)$\" data-tex=\"inline\"><\/math> \u0434\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4bf\/5b9\/aa3\/4bf5b9aa3cf274a87683c5290c902a97.svg\" alt=\"$O(\\sqrt{N})$\" data-tex=\"inline\"><\/math>. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u043b\u0438\u0431\u043e \u0440\u0430\u0432\u043d\u044b\u043c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a3b\/ac2\/1af\/a3bac21af8849a2981fd9d40234df512.svg\" alt=\"$\\sqrt{N}$\" data-tex=\"inline\"><\/math>, \u043b\u0438\u0431\u043e \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u043c \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0435\u0448\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">SegmentedSieveOfEratosthenes.cs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class SegmentedSieveOfEratosthenes : ISieve {     private long Length;     private int FirstChunkLength;     private long[] FirstPrimes;      public SegmentedSieveOfEratosthenes(long length)     {         Length = length;         FirstChunkLength = (int)Math.Sqrt(length) + 1;         SieveOfEratosthenes sieve = new SieveOfEratosthenes(FirstChunkLength);         List&lt;long&gt; firstPrimes = new List&lt;long&gt;();         sieve.ListPrimes(firstPrimes.Add);         FirstPrimes = firstPrimes.ToArray();     }      private void SieveSegment(BitArray segmentData, long segmentStart, long segmentEnd)     {         segmentData.SetAll(true);          foreach (long p in FirstPrimes)         {             long first = p * p;             if (first &lt; segmentStart)             {                 first += (segmentStart - first + p - 1) \/ p * p;             }              for (long i = first; i &lt; segmentEnd; i += p)             {                 segmentData[(int)(i - segmentStart)] = false;             }         }     }      public void ListPrimes(Action&lt;long&gt; callback)     {         foreach (long p in FirstPrimes) callback.Invoke(p);          int segmentLength = FirstChunkLength;         BitArray segmentData = new BitArray(segmentLength);         long segmentStart = FirstChunkLength;         long segmentEnd = Math.Min(segmentStart + segmentLength, Length);         while (segmentStart &lt; Length)         {             SieveSegment(segmentData, segmentStart, segmentEnd);             for (long i = segmentStart; i &lt; segmentEnd; i++)             {                 if (segmentData[(int)(i - segmentStart)]) callback.Invoke(i);             }             segmentStart = segmentEnd;             segmentEnd = Math.Min(segmentStart + segmentLength, Length);         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0417\u0430 \u0441\u0447\u0435\u0442 \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0435\u0448\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u0442\u0430 \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430 \u043d\u0430 \u0442\u0435\u0445 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c: <b>\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430<\/b><br \/>  \u0418\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430: <b>8.6 \u0441\u0435\u043a\u0443\u043d\u0434<\/b>.<\/p>\n<h2>8. \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u0442\u043e<\/h2>\n<p>  \u0414\u0430\u043d\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u00ab\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0439\u00bb \u2014 \u043e\u043d\u0430 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430, \u043d\u043e, \u043f\u043e\u0445\u043e\u0436\u0435, \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f. \u0426\u0435\u043b\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435, \u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u0443 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/839\/f25\/c27\/839f25c2746382debd4f08ea25ad5ecf.svg\" alt=\"$p$\" data-tex=\"inline\"><\/math>. \u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0434\u0440\u044f\u0434 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044f, \u043d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u0443, \u043a\u0440\u0430\u0442\u043d\u043e\u043c\u0443 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/839\/f25\/c27\/839f25c2746382debd4f08ea25ad5ecf.svg\" alt=\"$p$\" data-tex=\"inline\"><\/math>, \u0432\u044b\u0445\u043e\u0436\u044f\u0449\u0435\u043c\u0443 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u044b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f17\/639\/7e3\/f176397e3bbc048c508ae15c649c692f.svg\" alt=\"$p&lt;=\\sqrt{N}$\" data-tex=\"inline\"><\/math> \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u0435\u043c\u0443 \u0447\u0438\u0441\u043b\u043e. \u0412 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"cs\">long[] PrimeMultiples = FirstPrimes.Select(p =&gt; p * p).ToArray(); ... while(PrimeMultiples[i] &lt; segmentEnd) {     segmentData[PrimeMultiples[i] - segmentStart] = false;     PrimeMultiples[i] += FirstPrimes[i]; } <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 20%  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">OptimizedSegmentedSieve.cs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class OptimizedSegmentedSieve : ISieve {     const int BUFFER_LENGTH = 64 * 1024;     private long Length;     private long[] FirstPrimes;     private long[] PrimeMultiples;      public OptimizedSegmentedSieve(long length)     {         Length = length;         int firstChunkLength = (int)Math.Sqrt(length) + 1;         SieveOfEratosthenes sieve = new SieveOfEratosthenes(firstChunkLength);         List&lt;long&gt; firstPrimes = new List&lt;long&gt;();         sieve.ListPrimes(firstPrimes.Add);         FirstPrimes = firstPrimes.ToArray();         PrimeMultiples = FirstPrimes.Select(p =&gt; p * p).ToArray();     }      private void SieveSegment(BitArray segmentData, long segmentStart, long segmentEnd)     {         segmentData.SetAll(true);         long segmentLength = segmentEnd - segmentStart;         for (int i = 0; i &lt; PrimeMultiples.Length; i++)         {             long current = PrimeMultiples[i] - segmentStart;             long prime = FirstPrimes[i];             if (current &gt;= segmentLength) continue;              while (current &lt; segmentLength)             {                 segmentData[(int)current] = false;                 current += prime;             }             PrimeMultiples[i] = segmentStart + current;         }     }      public void ListPrimes(Action&lt;long&gt; callback)     {         BitArray segmentData = new BitArray(BUFFER_LENGTH);         long segmentStart = 2;         long segmentEnd = Math.Min(segmentStart + BUFFER_LENGTH, Length);         while (segmentStart &lt; Length)         {             SieveSegment(segmentData, segmentStart, segmentEnd);             for (int i = 0; i &lt; segmentEnd - segmentStart; i++)             {                 if (segmentData[i]) callback.Invoke(segmentStart + i);             }             segmentStart = segmentEnd;             segmentEnd = Math.Min(segmentStart + BUFFER_LENGTH, Length);         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c: <b>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u0442\u043e<\/b><br \/>  \u0418\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430: <b>7.1 \u0441\u0435\u043a\u0443\u043d\u0434<\/b>.<\/p>\n<h2>9. \u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0431\u0430\u0437\u043e\u0439 2<\/h2>\n<p>  \u0420\u0430\u043d\u044c\u0448\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0437\u0430\u0446\u0438\u044e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0443\u044e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0430\u043c \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443. \u0422\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u0430\u0441\u0441\u0438\u0432 PrimeMultiples \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/85b\/e24\/bc7\/85be24bc7bebecb83e1eb51d93caa4db.svg\" alt=\"$p^2 + kp$\" data-tex=\"inline\"><\/math>, \u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c27\/4f7\/687\/c274f7687c6db5f3d985ad49fd393c00.svg\" alt=\"$((p^2 + 2kp) - 1) \/ 2$\" data-tex=\"inline\"><\/math>:  <\/p>\n<pre><code class=\"cs\">long[] PrimeMultiples = FirstPrimes.Select(p =&gt; (p * p - 1) \/ 2).ToArray(); ... while(PrimeMultiples[i] &lt; segmentEnd) {     segmentData[PrimeMultiples[i] - segmentStart] = false;     PrimeMultiples[i] += FirstPrimes[i]; } <\/code><\/pre>\n<p>  \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f, \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 PrimeMultiples \u0438 \u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0431\u0438\u0442\u043e\u0432 \u0432 \u0447\u0438\u0441\u043b\u043e \u043f\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0439 \u043d\u0430\u043c \u0444\u043e\u0440\u043c\u0443\u043b\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c01\/d0e\/414\/c01d0e4149b0087f5a9b381b9a8cbc8e.svg\" alt=\"$p=2i+1$\" data-tex=\"inline\"><\/math>.   <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">SegmentedWheel2.cs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class SegmentedWheel2 : ISieve {     const int BUFFER_LENGTH = 64 * 1024;     private long Length;     private long[] FirstPrimes;     private long[] PrimeMultiples;      public SegmentedWheel2(long length)     {         Length = length;         int firstChunkLength = (int)Math.Sqrt(length) + 1;         SieveOfEratosthenes sieve = new SieveOfEratosthenes(firstChunkLength);         List&lt;long&gt; firstPrimes = new List&lt;long&gt;();         sieve.ListPrimes(firstPrimes.Add);         FirstPrimes = firstPrimes.Skip(1).ToArray();         PrimeMultiples = FirstPrimes.Select(p =&gt; (p * p - 1) \/ 2).ToArray();     }      private void SieveSegment(BitArray segmentData, long segmentStart, long segmentEnd)     {         segmentData.SetAll(true);         long segmentLength = segmentEnd - segmentStart;         for (int i = 0; i &lt; PrimeMultiples.Length; i++)         {             long current = PrimeMultiples[i] - segmentStart;             long prime = FirstPrimes[i];             if (current &gt;= segmentLength) continue;              while (current &lt; segmentLength)             {                 segmentData[(int)current] = false;                 current += prime;             }             PrimeMultiples[i] = segmentStart + current;         }     }      public void ListPrimes(Action&lt;long&gt; callback)     {         callback.Invoke(2);         BitArray segmentData = new BitArray(BUFFER_LENGTH);         long max = Length \/ 2;         long segmentStart = 1;         long segmentEnd = Math.Min(segmentStart + BUFFER_LENGTH, max);         while (segmentStart &lt; max)         {             SieveSegment(segmentData, segmentStart, segmentEnd);             for (int i = 0; i &lt; segmentEnd - segmentStart; i++)             {                 if (segmentData[i])                 {                     callback.Invoke((segmentStart + i) * 2 + 1);                 }             }             segmentStart = segmentEnd;             segmentEnd = Math.Min(segmentStart + BUFFER_LENGTH, max);         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u042d\u0442\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0431\u043e\u043b\u044c\u0449\u0435, \u0447\u0435\u043c \u0432\u0434\u0432\u043e\u0435:<\/p>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c: <b>\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0431\u0430\u0437\u043e\u0439 2<\/b><br \/>  \u0418\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430: <b>3.4 \u0441\u0435\u043a\u0443\u043d\u0434\u044b<\/b>.<\/p>\n<h2>10. \u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f (2,3)-\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>  \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0438\u0437 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430, \u0434\u0435\u043b\u044f\u0449\u0438\u0435\u0441\u044f \u043d\u0430 \u0434\u0432\u0430; \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043c \u0447\u0438\u0441\u043b\u0430, \u0434\u0435\u043b\u044f\u0449\u0438\u0435\u0441\u044f \u043d\u0430 2 \u0438 3. \u0422\u043e\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0447\u0438\u0441\u043b\u0430 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430: \u0434\u0430\u044e\u0449\u0438\u0435 1 \u0438\u043b\u0438 5 \u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435 \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 6. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0432\u0430: PrimeMultiples_6kPlus1 \u0438 PrimeMultiples_6kPlus5; \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u0430 \u0432\u0438\u0434\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f68\/2ce\/a67\/f682cea674d26355f729936993929b10.svg\" alt=\"$(n - 1) \/ 6$\" data-tex=\"inline\"><\/math> \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/652\/1d8\/dcb\/6521d8dcb09a12472ff4d53aacce72bc.svg\" alt=\"$(n - 5) \/ 6$\" data-tex=\"inline\"><\/math> \u0434\u043b\u044f \u0447\u0438\u0441\u0435\u043b, \u043a\u0440\u0430\u0442\u043d\u044b\u0445 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/839\/f25\/c27\/839f25c2746382debd4f08ea25ad5ecf.svg\" alt=\"$p$\" data-tex=\"inline\"><\/math>, \u0438\u043c\u0435\u044e\u0449\u0438\u0445 1 \u0438\u043b\u0438 5 \u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435 \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 6. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0438\u043b\u0438\u044f \u043d\u0443\u0436\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432\u0438\u0434\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/85b\/e24\/bc7\/85be24bc7bebecb83e1eb51d93caa4db.svg\" alt=\"$p^2+kp$\" data-tex=\"inline\"><\/math>, \u0438\u043c\u0435\u044e\u0449\u0435\u0435 \u043d\u0443\u0436\u043d\u044b\u0439 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 6, \u043d\u043e \u044d\u0442\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/ee3\/318\/5da\/ee33185daa5e1a12fdcbc799e1429b9f.svg\" alt=\"$k=0, 1, 2, 3, 4, 5$\" data-tex=\"inline\"><\/math>.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">SegmentedWheel23.cs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class SegmentedWheel23 : ISieve {     const int BUFFER_LENGTH = 128 * 1024;      private long Length;     private long[] FirstPrimes;     private long[] PrimeMultiples_6kPlus1;     private long[] PrimeMultiples_6kPlus5;      public SegmentedWheel23(long length)     {         Length = length;         int firstChunkLength = (int)Math.Sqrt(length) + 1;         SieveOfEratosthenes sieve = new SieveOfEratosthenes(firstChunkLength);         List&lt;long&gt; firstPrimes = new List&lt;long&gt;();         sieve.ListPrimes(firstPrimes.Add);         FirstPrimes = firstPrimes.Skip(2).ToArray();         PrimeMultiples_6kPlus1 = new long[FirstPrimes.Length];         PrimeMultiples_6kPlus5 = new long[FirstPrimes.Length];         for (int j = 0; j &lt; FirstPrimes.Length; j++)         {             long prime = FirstPrimes[j];             long val1 = prime * prime;             while (val1 % 6 != 1) val1 += 2 * prime;             PrimeMultiples_6kPlus1[j] = (val1 - 1) \/ 6;             long val2 = prime * prime;             while (val2 % 6 != 5) val2 += 2 * prime;             PrimeMultiples_6kPlus5[j] = (val2 - 5) \/ 6;         }     }      private void SieveSegment(BitArray segmentData_6kPlus1, BitArray segmentData_6kPlus5, long segmentStart, long segmentEnd)     {         segmentData_6kPlus1.SetAll(true);         segmentData_6kPlus5.SetAll(true);         long segmentLength = segmentEnd - segmentStart;         for (int j = 0; j &lt; FirstPrimes.Length; j++)         {             long prime = FirstPrimes[j];              long val1 = PrimeMultiples_6kPlus1[j] - segmentStart;             while (val1 &lt; segmentLength)             {                 segmentData_6kPlus1[(int)val1] = false;                 val1 += prime;             }             PrimeMultiples_6kPlus1[j] = val1 + segmentStart;              long val2 = PrimeMultiples_6kPlus5[j] - segmentStart;             while (val2 &lt; segmentLength)             {                 segmentData_6kPlus5[(int)val2] = false;                 val2 += prime;             }             PrimeMultiples_6kPlus5[j] = val2 + segmentStart;         }     }      public void ListPrimes(Action&lt;long&gt; callback)     {         callback.Invoke(2);         callback.Invoke(3);         callback.Invoke(5);         BitArray segmentData_6kPlus1 = new BitArray(BUFFER_LENGTH);         BitArray segmentData_6kPlus5 = new BitArray(BUFFER_LENGTH);         long max = (Length + 5) \/ 6;         long segmentStart = 1;         long segmentEnd = Math.Min(segmentStart + BUFFER_LENGTH, max);         while (segmentStart &lt; max)         {             SieveSegment(segmentData_6kPlus1, segmentData_6kPlus5, segmentStart, segmentEnd);             for (int i = 0; i &lt; segmentEnd - segmentStart; i++)             {                 if (segmentData_6kPlus1[i])                 {                     long p = (segmentStart + i) * 6 + 1;                     if (p &gt;= Length) break;                     callback.Invoke(p);                 }                 if (segmentData_6kPlus5[i])                 {                     long p = (segmentStart + i) * 6 + 5;                     if (p &gt;= Length) break;                     callback.Invoke(p);                  }             }             segmentStart = segmentEnd;             segmentEnd = Math.Min(segmentStart + BUFFER_LENGTH, max);         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c: <b>\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f (2,3)-\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/b><br \/>  \u0418\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430: <b>2.6 \u0441\u0435\u043a\u0443\u043d\u0434\u044b<\/b>.<\/p>\n<h2>11. \u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f (2,3,5)-\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>  \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0442\u0443 \u0436\u0435 \u0438\u0434\u0435\u044e \u0434\u043b\u044f \u0447\u0438\u0441\u0435\u043b, \u043d\u0435 \u0434\u0435\u043b\u044f\u0449\u0438\u0445\u0441\u044f \u043d\u0430 2, 3 \u0438 5. \u0422\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0434\u0432\u0430 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0430 \u0432\u043e\u0441\u0435\u043c\u044c, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 30: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/ad2\/f7c\/e96\/ad2f7ce96e7c89dcc0755ac0334ae78d.svg\" alt=\"$(1, 7, 11, 13, 17, 19, 23, 29)$\" data-tex=\"inline\"><\/math>. \u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f, \u0438 \u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u0435\u0449\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">SegmentedWheel235.cs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class SegmentedWheel235 : ISieve {     const int BUFFER_LENGTH = 128 * 1024;     const int WHEEL = 30;     const int WHEEL_PRIMES_COUNT = 3;     private long[] WheelRemainders = { 1, 7, 11, 13, 17, 19, 23, 29 };     private long[] SkipPrimes = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 };      private long Length;     private long[] FirstPrimes;     private long[][] PrimeMultiples;      public SegmentedWheel235(long length)     {         Length = length;         int firstChunkLength = (int)Math.Sqrt(length) + 1;         SieveOfEratosthenes sieve = new SieveOfEratosthenes(firstChunkLength);         List&lt;long&gt; firstPrimes = new List&lt;long&gt;();         sieve.ListPrimes(firstPrimes.Add);         FirstPrimes = firstPrimes.Skip(WHEEL_PRIMES_COUNT).ToArray();         PrimeMultiples = new long[WheelRemainders.Length][];         for (int i = 0; i &lt; WheelRemainders.Length; i++)         {             PrimeMultiples[i] = new long[FirstPrimes.Length];             for (int j = 0; j &lt; FirstPrimes.Length; j++)             {                 long prime = FirstPrimes[j];                 long val = prime * prime;                 while (val % WHEEL != WheelRemainders[i]) val += 2 * prime;                 PrimeMultiples[i][j] = (val - WheelRemainders[i]) \/ WHEEL;             }         }     }      private void SieveSegment(BitArray[] segmentDatas, long segmentStart, long segmentEnd)     {         for (int i = 0; i &lt; segmentDatas.Length; i++)         {             BitArray segmentData = segmentDatas[i];             segmentData.SetAll(true);             long segmentLength = segmentEnd - segmentStart;             for (int j = 0; j &lt; PrimeMultiples[i].Length; j++)             {                 long current = PrimeMultiples[i][j] - segmentStart;                 long prime = FirstPrimes[j];                 if (current &gt;= segmentLength) continue;                  while (current &lt; segmentLength)                 {                     segmentData[(int)current] = false;                     current += prime;                 }                 PrimeMultiples[i][j] = segmentStart + current;             }         }     }      public void ListPrimes(Action&lt;long&gt; callback)     {         foreach (long prime in SkipPrimes) if (prime &lt; Length) callback.Invoke(prime);          BitArray[] segmentDatas = new BitArray[WheelRemainders.Length];         for (int i = 0; i &lt; segmentDatas.Length; i++)         {             segmentDatas[i] = new BitArray(BUFFER_LENGTH);         }         long max = (Length + WHEEL - 1) \/ WHEEL;         long segmentStart = 1;         long segmentEnd = Math.Min(segmentStart + BUFFER_LENGTH, max);         while (segmentStart &lt; max)         {             SieveSegment(segmentDatas, segmentStart, segmentEnd);             for (int i = 0; i &lt; segmentEnd - segmentStart; i++)             {                 long offset = (segmentStart + i) * WHEEL;                 for (int j = 0; j &lt; segmentDatas.Length; j++)                 {                     if (segmentDatas[j][i])                     {                         long p = offset + WheelRemainders[j];                         if (p &gt;= Length) break;                         callback.Invoke(p);                     }                 }             }             segmentStart = segmentEnd;             segmentEnd = Math.Min(segmentStart + BUFFER_LENGTH, max);         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c: <b>\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f (2,3,5)-\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/b><br \/>  \u0418\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430: <b>2.3 \u0441\u0435\u043a\u0443\u043d\u0434\u044b<\/b>.<\/p>\n<h2>12. \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f (2,3,5)-\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>  \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0447\u0438\u0441\u0435\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u043c, \u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0431\u0430\u0439\u0442\u0430 \u0438 \u0431\u0438\u0442\u0430 \u0432 \u0431\u0438\u0442\u043e\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 (\u043a\u0430\u043a \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0438, \u0442\u0430\u043a \u0438 \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b) \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u043d\u0430\u043c \u0442\u0440\u044e\u043a\u043e\u043c, \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0442\u0435\u043c, \u0447\u0442\u043e \u0432 \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0431\u0430\u0437\u043e\u0439 (2,3,5) \u0432\u043e\u0441\u0435\u043c\u044c \u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432: \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u043e\u0441\u044c\u043c\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0434\u0438\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u0432\u043e\u0441\u044c\u043c\u0438 \u0431\u0438\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0432\u043e\u0439 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 30. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 PrimeMultiples \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 <b>\u0431\u0430\u0439\u0442\u0430<\/b>, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0431\u0438\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c. \u0422\u043e\u0433\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c:  <\/p>\n<pre><code class=\"cs\">while (current &lt; segmentLength) {     segmentData[current] &amp;= mask;     current += prime; } <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0443\u0436\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041e\u0434\u043d\u0430\u043a\u043e \u043b\u044e\u0431\u043e\u0439 \u0431\u0430\u0439\u0442 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e 256 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0432\u0441\u0435 256 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432, \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<br \/>  <code>\u0431\u0430\u0439\u0442 = 255 = 0b11111111, \u043e\u0441\u0442\u0430\u0442\u043a\u0438: [1, 7, 11, 13, 17, 19, 23, 29]<br \/>  \u0431\u0430\u0439\u0442 = 9 = 0b00001001, \u043e\u0441\u0442\u0430\u0442\u043a\u0438: [1, 13]<br \/>  \u0431\u0430\u0439\u0442 = 135 = 0b10000111, \u043e\u0441\u0442\u0430\u0442\u043a\u0438: [1, 7, 11, 29]<\/code><br \/>  \u0422\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u0446\u0438\u043a\u043b\u0443:   <\/p>\n<pre><code class=\"cs\">for (int i = 0; i &lt; segmentData.Length; i++) {     byte data = segmentData[i];     int[] offsets = OffsetsPerByte[data];     for (int j = 0; j &lt; offsets.Length; j++)     {         long p = (segmentStart + i) * 30 + offsets[j];         if (p &gt;= Length) break;         callback.Invoke(p);     } } <\/code><\/pre>\n<p>  \u042d\u0442\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u043d\u0430\u0439\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0437\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443!  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">OptimizedSegmentedWheel235.cs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class OptimizedSegmentedWheel235 : ISieve {     const int BUFFER_LENGTH = 200 * 1024;     const int WHEEL = 30;     const int WHEEL_PRIMES_COUNT = 3;      private static long[] WheelRemainders = { 1, 7, 11, 13, 17, 19, 23, 29 };     private static long[] SkipPrimes = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 };     private static byte[] Masks = { 1, 2, 4, 8, 16, 32, 64, 128 };     private static int[][] OffsetsPerByte;      private long Length;     private long[] FirstPrimes;     private long[][] PrimeMultiples;      static OptimizedSegmentedWheel235()     {         OffsetsPerByte = new int[256][];         List&lt;int&gt; offsets = new List&lt;int&gt;();         for (int b = 0; b &lt; 256; b++)         {             offsets.Clear();             for (int i = 0; i &lt; WheelRemainders.Length; i++)             {                 if ((b &amp; Masks[i]) != 0) offsets.Add((int)WheelRemainders[i]);             }             OffsetsPerByte[b] = offsets.ToArray();         }     }      public OptimizedSegmentedWheel235(long length)     {         Length = length;         int firstChunkLength = (int)Math.Sqrt(length) + 1;         SieveOfEratosthenes sieve = new SieveOfEratosthenes(firstChunkLength);         List&lt;long&gt; firstPrimes = new List&lt;long&gt;();         sieve.ListPrimes(firstPrimes.Add);         FirstPrimes = firstPrimes.Skip(WHEEL_PRIMES_COUNT).ToArray();         PrimeMultiples = new long[WheelRemainders.Length][];         for (int i = 0; i &lt; WheelRemainders.Length; i++)         {             PrimeMultiples[i] = new long[FirstPrimes.Length];             for (int j = 0; j &lt; FirstPrimes.Length; j++)             {                 long prime = FirstPrimes[j];                 long val = prime * prime;                 while (val % WHEEL != WheelRemainders[i]) val += 2 * prime;                 PrimeMultiples[i][j] = (val - WheelRemainders[i]) \/ WHEEL;             }         }     }      private void SieveSegment(byte[] segmentData, long segmentStart, long segmentEnd)     {         for (int i = 0; i &lt; segmentData.Length; i++) segmentData[i] = 255;         long segmentLength = segmentEnd - segmentStart;          for (int i = 0; i &lt; WheelRemainders.Length; i++)         {             byte mask = (byte)~Masks[i];             for (int j = 0; j &lt; PrimeMultiples[i].Length; j++)             {                 long current = PrimeMultiples[i][j] - segmentStart;                 if (current &gt;= segmentLength) continue;                 long prime = FirstPrimes[j];                  while (current &lt; segmentLength)                 {                     segmentData[current] &amp;= mask;                     current += prime;                 }                  PrimeMultiples[i][j] = segmentStart + current;             }         }     }      public void ListPrimes(Action&lt;long&gt; callback)     {         foreach (long prime in SkipPrimes) if (prime &lt; Length) callback.Invoke(prime);          long max = (Length + WHEEL - 1) \/ WHEEL;         byte[] segmentData = new byte[BUFFER_LENGTH];         long segmentStart = 1;         long segmentEnd = Math.Min(segmentStart + BUFFER_LENGTH, max);         while (segmentStart &lt; max)         {             SieveSegment(segmentData, segmentStart, segmentEnd);             for (int i = 0; i &lt; segmentData.Length; i++)             {                 long offset = (segmentStart + i) * WHEEL;                 byte data = segmentData[i];                 int[] offsets = OffsetsPerByte[data];                 for (int j = 0; j &lt; offsets.Length; j++)                 {                     long p = offset + offsets[j];                     if (p &gt;= Length) break;                     callback.Invoke(p);                 }             }             segmentStart = segmentEnd;             segmentEnd = Math.Min(segmentStart + BUFFER_LENGTH, max);         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c: <b>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f (2,3,5)-\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/b><br \/>  \u0418\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430: <b>0.93 \u0441\u0435\u043a\u0443\u043d\u0434\u044b<\/b>.<\/p>\n<h2>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0434\u043e \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430<\/h2>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u0434, \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0438 \u0438\u0449\u0443\u0449\u0438\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438:  <\/p>\n<pre><code class=\"cs\">static void Main(string[] args) {     var sieve = new OptimizedSegmentedWheel235(1_000_000_000_000);     long maxDistance = 0;     long lastPrime = 0;     Action&lt;long&gt; action = (p) =&gt;     {         long dist = p - lastPrime;         if (dist &gt; maxDistance)         {             Console.WriteLine($&quot;{p} - {lastPrime} = {dist}&quot;);             maxDistance = dist;         }         lastPrime = p;     };     sieve.ListPrimes(action); } <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<br \/>  \u041f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e <b>1,000,000,000,000<\/b><br \/>  \u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b: <b>26 \u043c\u0438\u043d\u0443\u0442 30 \u0441\u0435\u043a\u0443\u043d\u0434<\/b><br \/>  \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438: <b>540<\/b><br \/>  \u043c\u0435\u0436\u0434\u0443 738,832,927,927 \u0438 738,832,928,467 <\/p>\n<h2>\u041b\u0443\u0447\u0448\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/h2>\n<p>  \u0420\u0430\u0441\u0441\u043a\u0430\u0437 \u0431\u044b\u043b \u0431\u044b \u043d\u0435 \u043f\u043e\u043b\u043e\u043d \u0431\u0435\u0437 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441 \u043b\u0443\u0447\u0448\u0438\u043c\u0438 \u0438\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043f\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b.<br \/>  \u0421\u0430\u043c\u0430\u044f \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u2014 <a href=\"https:\/\/cr.yp.to\/primegen.html\" rel=\"nofollow\">primegen<\/a>, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0440\u0435\u0448\u0435\u0442\u0435 \u0410\u0442\u043a\u0438\u043d\u0430. \u041e\u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 C \u0441\u0430\u043c\u0438\u043c \u0414\u0430\u043d\u0438\u044d\u043b\u0435\u043c \u0411\u0435\u0440\u043d\u0448\u0442\u0435\u0439\u043d\u043e\u043c (\u0441\u043e\u0430\u0432\u0442\u043e\u0440\u043e\u043c \u0410\u0442\u043a\u0438\u043d\u0430) 20 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043f\u043e\u0434 \u041f\u0435\u043d\u0442\u0438\u0443\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 conf-words:<br \/>  <code>2048<br \/>  This is B\/32: the number of 32-bit words of space used in the primegen<br \/>  inner loop. This should fit into the CPU's level-1 cache.<\/p>\n<p>  2048 works well on a Pentium-100.<br \/>  3600 works well on a Pentium II-350.<br \/>  4004 works well on an UltraSPARC-I\/167.<br \/>  <\/code><br \/>  \u041d\u0430 \u043c\u043e\u0435\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 65536 \u0431\u0430\u0439\u0442. \u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432\u0445\u043e\u0434\u0438\u0442 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 primegaps, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0438\u0449\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438. \u0412\u0440\u0435\u043c\u044f \u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0434\u043e \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u2014 19 \u043c\u0438\u043d\u0443\u0442.<\/p>\n<p>  \u041d\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u0430\u044f \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u2014 <a href=\"https:\/\/github.com\/kimwalisch\/primesieve\" rel=\"nofollow\">primesieve<\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043d\u0430 c++ \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0430\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445, \u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0435\u0448\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c. \u041d\u0430 \u043c\u043e\u0435\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0432 8 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0437\u0430 70 \u0441\u0435\u043a\u0443\u043d\u0434. \u0410\u0432\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Kim Walish \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 <a href=\"https:\/\/github.com\/kimwalisch\/primesieve\/blob\/master\/src\/README.md\" rel=\"nofollow\">\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u043a\u043e\u0434\u0435<\/a>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u044b\u0445 \u043b\u0443\u0447\u0448\u0438\u0445 \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u0438 \u0434\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/526924\/\"> https:\/\/habr.com\/ru\/post\/526924\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/tz\/df\/dw\/tzdfdwbfqcejvbysekihfbrzrce.png\" alt=\"image\"><\/p>\n<p>  \u041f\u043e\u0438\u0441\u043a \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u2014 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432, \u0443\u0432\u043b\u0435\u043a\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439. \u0421\u0430\u043c\u044b\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439, \u043f\u043e-\u0432\u0438\u0434\u0438\u043c\u043e\u043c\u0443, \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445 \u0442\u044b\u0441\u044f\u0447 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434, \u2014 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B5%D1%88%D0%B5%D1%82%D0%BE_%D0%AD%D1%80%D0%B0%D1%82%D0%BE%D1%81%D1%84%D0%B5%D0%BD%D0%B0\" rel=\"nofollow\">\u0440\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430<\/a>; \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u0435\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0435\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439. <br \/>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 C#, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u2014 \u0440\u0435\u0448\u0435\u0442\u0430 \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430, \u0421\u0443\u043d\u0434\u0430\u0440\u0430\u043c\u0430 \u0438 \u0410\u0442\u043a\u0438\u043d\u0430, \u0438 \u043a\u043e\u043d\u0447\u0430\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 (\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f). \u041e\u0441\u043e\u0431\u044b\u0439 \u0443\u043f\u043e\u0440 \u044f \u0434\u0435\u043b\u0430\u043b \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443: \u0441\u0430\u043c\u044b\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438\u0437 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 120 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u0438 \u0438\u0449\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0437\u0430 30 \u043c\u0438\u043d\u0443\u0442, \u0430 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430 \u2014 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0437\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 (\u044d\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043e\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043b\u0443\u0447\u0448\u0438\u0445 \u0438\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043f\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043d\u043e \u044d\u0442\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u0432\u044b\u0448\u0435 4000 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430).<br \/>  \u0412 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0441\u0430\u043c\u0443\u044e \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0434\u043e \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430. \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442, \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u043c \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0443\u0433\u0430\u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442. \u0414\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0434\u043e 100 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e 8 (\u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 89 \u0438 97), \u0430 \u0434\u043e \u0442\u044b\u0441\u044f\u0447\u0438 \u2014 20 (\u043c\u0435\u0436\u0434\u0443 887 \u0438 907).<br \/>  \u0412\u0435\u0441\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/lightln2\/Primes\" rel=\"nofollow\">\u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435<\/a>.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-312881","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/312881","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=312881"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/312881\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=312881"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=312881"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=312881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}