New version

This commit is contained in:
2020-11-04 00:23:14 +03:00
parent 8c374d93bc
commit d2d31dfeff
157 changed files with 2650 additions and 1686 deletions

View File

@@ -1,29 +1,29 @@
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--><!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]--><!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]--><!--[if gt IE 8]><!--><html class="no-js"> <head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><title>Моё решение задачи 134</title><meta name="description" content><meta name="viewport" content="width=device-width"><link rel="stylesheet" href="../../theme/css/normalize.css"><link href="https://fonts.googleapis.com/css?family=Forum|Oswald|PT+Sans|Philosopher|Ubuntu+Mono" rel="stylesheet"><link rel="stylesheet" href="../../theme/css/font-awesome.min.css"><link rel="stylesheet" href="../../theme/css/main.css"><link rel="stylesheet" href="../../theme/css/blog.css"><link rel="stylesheet" href="../../theme/css/github.css"><link href="https://likemath.ru/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title="Блог 529 Atom Feed"><link href="https://likemath.ru/feeds/all.rss.xml" type="application/rss+xml" rel="alternate" title="Блог 529 RSS Feed"><script src="../../theme/js/vendor/modernizr-2.6.2.min.js"></script></head><body><!--[if lt IE 7]>
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--><!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]--><!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]--><!--[if gt IE 8]><!--><html class=no-js> <!--<![endif]--> <head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><title>Моё решение задачи 134</title><meta name=description content><meta name=viewport content="width=device-width"><link rel=stylesheet href=../../theme/css/normalize.css><link href="https://fonts.googleapis.com/css?family=Forum|Oswald|PT+Sans|Philosopher|Ubuntu+Mono" rel=stylesheet><link rel=stylesheet href=../../theme/css/font-awesome.min.css><link rel=stylesheet href=../../theme/css/main.css><link rel=stylesheet href=../../theme/css/blog.css><link rel=stylesheet href=../../theme/css/github.css><link href=https://likemath.ru/feeds/all.atom.xml type=application/atom+xml rel=alternate title="Блог 529 Atom Feed"><link href=https://likemath.ru/feeds/all.rss.xml type=application/rss+xml rel=alternate title="Блог 529 RSS Feed"><script src=../../theme/js/vendor/modernizr-2.6.2.min.js></script></head> <body> <!--[if lt IE 7]>
<p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p>
<![endif]--><div id="wrapper"><header id="sidebar" class="side-shadow"><hgroup id="site-header"><a id="site-title" href="../.."><h2><i class="icon-pencil"></i> Блог 529</h2></a><p id="site-desc"> Project Euler и остальное </p></hgroup><nav><ul id="nav-links"><li><a href="../../">Главная</a></li><li><a href="../../pages/projects.html">Мои проекты</a></li><li><a href="../../pages/about.html">Об авторе</a></li><li><a href="../../feeds/feed.atom.xml">Atom feed</a></li></ul></nav><footer id="site-info"><p> Powered by Pelican. </p></footer></header><div id="post-container"><ol id="post-list"><li><article class="post-entry"><header class="entry-header"><time class="post-time" datetime="2016-10-30T17:40:00+03:00" pubdate> Вс 30 Октябрь 2016 </time><a href="../../posts/moio-reshenie-zadachi-134/" rel="bookmark"><h1>Моё решение задачи&nbsp;134</h1></a></header><section class="post-content"><p>Назовём <em>порождающим</em> для двух последовательных простых <span class="math">\(p_1 &lt; p_2\)</span> наименьшее натуральное число, что оно закачивается на <span class="math">\(p_1\)</span> и при этом делится на <span class="math">\(p_2\)</span>. Необходимо найти сумму порождающих для всех <span class="math">\(p_1 \in \left[ 5; 10^6&nbsp;\right]\)</span></p><p>Например, если <span class="math">\(p_1 = 19\)</span>, то следующее простое <span class="math">\(p_2 = 23\)</span>. Тогда порождающим будет число <span class="math">\(1219\)</span>, при этом <span class="math">\(1219 \: \vdots \: 23\)</span>.</p><p>Полное условие можно найти <a href="https://projecteuler.net/problem=134">тут</a></p><p>Несмотря на то, что сложность задачи 45%, для её решения достаточно выписать&nbsp;условие.</p><p>Пусть <span class="math">\(p_1\)</span> содержит в себе <span class="math">\(k\)</span> цифр, т.е. <span class="math">\(n = r \cdot 10^k + p_1\)</span>, где <span class="math">\(r\)</span> &#8212; какое-то натуральное число с отрезка <span class="math">\(\left[ 1; p_2-1&nbsp;\right]\)</span></p><p>Давайте посчитаем остатки по модулю <span class="math">\(p_2\)</span>: <span class="math">\(n \equiv r \cdot 10^k + p_1 \equiv 0\)</span>. Отсюда получим явную формулу для <span class="math">\(r\)</span>: </p><div class="math">$$ r \equiv -p_1 \cdot 10^{-k} \equiv -p_1 \cdot 10^{p_2 -1-k} $$</div><p>Комментарии:</p><ol><li>Так как <span class="math">\(a^p \equiv a \mod p\)</span>, то верно что <span class="math">\(a^{-k} \equiv a^{p -1-k} \mod&nbsp;p\)</span></li><li>Это всё бессмысленно, если не знать про <a href="https://ru.wikipedia.org/wiki/Алгоритмы_быстрогоозведения_в_степень">алгоритм быстрого возведения в степень</a>, который делает асимптотическую сложность возведения в степень&nbsp;логарифмической.</li></ol><p>У нас есть явная формула для порождающего, и мы знаем как её быстро посчитать. Ниже приведён код на Python с использованием <a href="http://www.sympy.org/ru/">sympy</a>.</p><div class="highlight"><pre><span class="code-line"><span></span><span class="kn">from</span> <span class="nn">sympy</span> <span class="kn">import</span> <span class="n">primerange</span> <span class="c1"># для получения простых чисел</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># быстрое возведение в степень по модулю</span></span>
<span class="code-line"><span class="k">def</span> <span class="nf">fast_pow</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">modulo</span><span class="p">):</span></span>
<span class="code-line"> <span class="k">if</span> <span class="n">y</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span></span>
<span class="code-line"> <span class="k">return</span> <span class="mi">1</span></span>
<span class="code-line"> <span class="n">p</span> <span class="o">=</span> <span class="n">fast_pow</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">//</span> <span class="mi">2</span><span class="p">,</span> <span class="n">modulo</span><span class="p">)</span></span>
<span class="code-line"> <span class="n">p</span> <span class="o">=</span> <span class="p">(</span><span class="n">p</span> <span class="o">*</span> <span class="n">p</span><span class="p">)</span> <span class="o">%</span> <span class="n">modulo</span></span>
<span class="code-line"> <span class="k">if</span> <span class="n">y</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span></span>
<span class="code-line"> <span class="n">p</span> <span class="o">=</span> <span class="p">(</span><span class="n">p</span> <span class="o">*</span> <span class="n">x</span><span class="p">)</span> <span class="o">%</span> <span class="n">modulo</span></span>
<span class="code-line"> <span class="k">return</span> <span class="n">p</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># нам нужно первое простое, которое больше 10^6 -- 10^6+3</span></span>
<span class="code-line"><span class="n">primes</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">primerange</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">10</span><span class="o">**</span><span class="mi">6</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span> </span>
<span class="code-line"></span>
<span class="code-line"><span class="n">sm</span> <span class="o">=</span> <span class="mi">0</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">primes</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span></span>
<span class="code-line"> <span class="n">digs</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">primes</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span> <span class="c1"># количество цифр</span></span>
<span class="code-line"> <span class="n">r</span> <span class="o">=</span> <span class="p">(</span><span class="n">primes</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span> <span class="o">-</span> <span class="n">primes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">fast_pow</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="n">primes</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">digs</span><span class="p">,</span> <span class="n">primes</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]))</span> <span class="o">%</span> <span class="n">primes</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span></span>
<span class="code-line"> <span class="n">sm</span> <span class="o">+=</span> <span class="n">r</span> <span class="o">*</span> <span class="mi">10</span><span class="o">**</span><span class="n">digs</span> <span class="o">+</span> <span class="n">primes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">print</span><span class="p">(</span><span class="s1">&#39;Result is {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sm</span><span class="p">))</span></span>
</pre></div><p>Ответ: <strong>18613426663617118</strong></p><script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
<![endif]--> <div id=wrapper> <header id=sidebar class=side-shadow> <hgroup id=site-header> <a id=site-title href=../..><h2><i class=icon-pencil></i> Блог 529</h2></a> <p id=site-desc> Project Euler и остальное </p> </hgroup> <nav> <ul id=nav-links> <li><a href=../../ >Главная</a></li> <li><a href=../../pages/projects.html>Мои проекты</a></li> <li><a href=../../pages/about.html>Об авторе</a></li> <li><a href=../../feeds/feed.atom.xml>Atom feed</a></li> </ul> </nav> <footer id=site-info> <p> Powered by Pelican. </p> </footer></header> <div id=post-container> <ol id=post-list> <li> <article class=post-entry> <header class=entry-header> <time class=post-time datetime=2016-10-30T17:40:00+03:00 pubdate> Вс 30 октября 2016 </time> <a href=../../posts/moio-reshenie-zadachi-134/ rel=bookmark><h1>Моё решение задачи&nbsp;134</h1></a> </header> <section class=post-content> <p>Назовём <em>порождающим</em> для двух последовательных простых <span class=math>\(p_1 &lt; p_2\)</span> наименьшее натуральное число, что оно закачивается на <span class=math>\(p_1\)</span> и при этом делится на <span class=math>\(p_2\)</span>. Необходимо найти сумму порождающих для всех <span class=math>\(p_1 \in \left[ 5; 10^6&nbsp;\right]\)</span></p> <p>Например, если <span class=math>\(p_1 = 19\)</span>, то следующее простое <span class=math>\(p_2 = 23\)</span>. Тогда порождающим будет число <span class=math>\(1219\)</span>, при этом <span class=math>\(1219 \: \vdots \: 23\)</span>.</p> <p>Полное условие можно найти <a href="https://projecteuler.net/problem=134">тут</a></p> <p>Несмотря на то, что сложность задачи 45%, для её решения достаточно выписать&nbsp;условие.</p> <p>Пусть <span class=math>\(p_1\)</span> содержит в себе <span class=math>\(k\)</span> цифр, т.е. <span class=math>\(n = r \cdot 10^k + p_1\)</span>, где <span class=math>\(r\)</span> &#8212; какое-то натуральное число с отрезка <span class=math>\(\left[ 1; p_2-1&nbsp;\right]\)</span></p> <p>Давайте посчитаем остатки по модулю <span class=math>\(p_2\)</span>: <span class=math>\(n \equiv r \cdot 10^k + p_1 \equiv 0\)</span>. Отсюда получим явную формулу для <span class=math>\(r\)</span>: </p> <div class=math>$$ r \equiv -p_1 \cdot 10^{-k} \equiv -p_1 \cdot 10^{p_2 -1-k} $$</div> <p>Комментарии:</p> <ol> <li>Так как <span class=math>\(a^p \equiv a \mod p\)</span>, то верно что <span class=math>\(a^{-k} \equiv a^{p -1-k} \mod&nbsp;p\)</span></li> <li>Это всё бессмысленно, если не знать про <a href=https://ru.wikipedia.org/wiki/Алгоритмы_быстрогоозведения_в_степень>алгоритм быстрого возведения в степень</a>, который делает асимптотическую сложность возведения в степень&nbsp;логарифмической.</li> </ol> <p>У нас есть явная формула для порождающего, и мы знаем как её быстро посчитать. Ниже приведён код на Python с использованием <a href=http://www.sympy.org/ru/ >sympy</a>.</p> <div class=highlight><pre><span class=code-line><span></span><span class=kn>from</span> <span class=nn>sympy</span> <span class=kn>import</span> <span class=n>primerange</span> <span class=c1># для получения простых чисел</span></span>
<span class=code-line></span>
<span class=code-line><span class=c1># быстрое возведение в степень по модулю</span></span>
<span class=code-line><span class=k>def</span> <span class=nf>fast_pow</span><span class=p>(</span><span class=n>x</span><span class=p>,</span> <span class=n>y</span><span class=p>,</span> <span class=n>modulo</span><span class=p>):</span></span>
<span class=code-line> <span class=k>if</span> <span class=n>y</span> <span class=o>==</span> <span class=mi>0</span><span class=p>:</span></span>
<span class=code-line> <span class=k>return</span> <span class=mi>1</span></span>
<span class=code-line> <span class=n>p</span> <span class=o>=</span> <span class=n>fast_pow</span><span class=p>(</span><span class=n>x</span><span class=p>,</span> <span class=n>y</span> <span class=o>//</span> <span class=mi>2</span><span class=p>,</span> <span class=n>modulo</span><span class=p>)</span></span>
<span class=code-line> <span class=n>p</span> <span class=o>=</span> <span class=p>(</span><span class=n>p</span> <span class=o>*</span> <span class=n>p</span><span class=p>)</span> <span class=o>%</span> <span class=n>modulo</span></span>
<span class=code-line> <span class=k>if</span> <span class=n>y</span> <span class=o>%</span> <span class=mi>2</span><span class=p>:</span></span>
<span class=code-line> <span class=n>p</span> <span class=o>=</span> <span class=p>(</span><span class=n>p</span> <span class=o>*</span> <span class=n>x</span><span class=p>)</span> <span class=o>%</span> <span class=n>modulo</span></span>
<span class=code-line> <span class=k>return</span> <span class=n>p</span></span>
<span class=code-line></span>
<span class=code-line><span class=c1># нам нужно первое простое, которое больше 10^6 -- 10^6+3</span></span>
<span class=code-line><span class=n>primes</span> <span class=o>=</span> <span class=nb>list</span><span class=p>(</span><span class=n>primerange</span><span class=p>(</span><span class=mi>5</span><span class=p>,</span><span class=mi>10</span><span class=o>**</span><span class=mi>6</span><span class=o>+</span><span class=mi>4</span><span class=p>))</span> </span>
<span class=code-line></span>
<span class=code-line><span class=n>sm</span> <span class=o>=</span> <span class=mi>0</span></span>
<span class=code-line></span>
<span class=code-line><span class=k>for</span> <span class=n>i</span> <span class=ow>in</span> <span class=nb>range</span><span class=p>(</span><span class=nb>len</span><span class=p>(</span><span class=n>primes</span><span class=p>)</span> <span class=o>-</span> <span class=mi>1</span><span class=p>):</span></span>
<span class=code-line> <span class=n>digs</span> <span class=o>=</span> <span class=nb>len</span><span class=p>(</span><span class=nb>str</span><span class=p>(</span><span class=n>primes</span><span class=p>[</span><span class=n>i</span><span class=p>]))</span> <span class=c1># количество цифр</span></span>
<span class=code-line> <span class=n>r</span> <span class=o>=</span> <span class=p>(</span><span class=n>primes</span><span class=p>[</span><span class=n>i</span><span class=o>+</span><span class=mi>1</span><span class=p>]</span><span class=o>**</span><span class=mi>2</span> <span class=o>-</span> <span class=n>primes</span><span class=p>[</span><span class=n>i</span><span class=p>]</span> <span class=o>*</span> <span class=n>fast_pow</span><span class=p>(</span><span class=mi>10</span><span class=p>,</span> <span class=n>primes</span><span class=p>[</span><span class=n>i</span><span class=o>+</span><span class=mi>1</span><span class=p>]</span> <span class=o>-</span> <span class=mi>1</span> <span class=o>-</span> <span class=n>digs</span><span class=p>,</span> <span class=n>primes</span><span class=p>[</span><span class=n>i</span><span class=o>+</span><span class=mi>1</span><span class=p>]))</span> <span class=o>%</span> <span class=n>primes</span><span class=p>[</span><span class=n>i</span><span class=o>+</span><span class=mi>1</span><span class=p>]</span></span>
<span class=code-line> <span class=n>sm</span> <span class=o>+=</span> <span class=n>r</span> <span class=o>*</span> <span class=mi>10</span><span class=o>**</span><span class=n>digs</span> <span class=o>+</span> <span class=n>primes</span><span class=p>[</span><span class=n>i</span><span class=p>]</span></span>
<span class=code-line></span>
<span class=code-line><span class=k>print</span><span class=p>(</span><span class=s1>&#39;Result is {}&#39;</span><span class=o>.</span><span class=n>format</span><span class=p>(</span><span class=n>sm</span><span class=p>))</span></span>
</pre></div> <p>Ответ: <strong>18613426663617118</strong></p> <script type=text/javascript>if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
@@ -37,11 +37,14 @@
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
mathjaxscript[(window.opera ? "innerHTML" : "text")] =
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
@@ -55,6 +58,8 @@
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
@@ -75,9 +80,11 @@
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script></section><hr><aside class="post-meta"><p>Категория: <a href="../../category/project-euler.html">Project Euler</a></p><p>Теги: <a href="../../tag/project-euler.html">Project Euler</a>, <a href="../../tag/python.html">Python</a>, <a href="../../tag/sympy.html">sympy</a>, </p></aside><hr></article></li></ol></div></div><script type="text/javascript">
</script> </section> <hr> <aside class=post-meta> <p>Категория: <a href=../../category/project-euler.html>Project Euler</a></p> <p>Теги: <a href=../../tag/project-euler.html>Project Euler</a>, <a href=../../tag/python.html>Python</a>, <a href=../../tag/sympy.html>sympy</a>, </p> </aside> <hr> </article> </li> </ol> </div> </div> <script type=text/javascript>
var _paq = _paq || [];
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
@@ -88,4 +95,4 @@
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})();
</script> <script src="../../theme/js/main.js"></script></body></html>
</script> <script src=../../theme/js/main.js></script> </body> </html>