I definitely believe that a good way to improve our current math curriculum would be to weave in computational number theory.&nbsp; This would be the 21st century answer to &#39;back to basics&#39;.&nbsp; <br><br>I think a huge problem in student math illiteracy has to do with not understanding division, remainders, and ratios.&nbsp; When dealing with division, our curriculum tends to focus on quotients, but understanding the nature of the remainder has a lot to do with what math and technology are about these days.<br>
<br>Exploring how to find primes is definitely a &#39;must include&#39; in a computational math curriculum.&nbsp; I think students should explore this in a variety of ways, including both sieves and generators, discussing why one might choose one approach or another in various situations.&nbsp; This would do a whole lot of good for both math and tech literacy simultaneously.<br>
<br>An interesting fact is that, except for 2 and 3, all primes are adjacent to a multiple of 6.&nbsp; That is easy to prove:<br><br>&nbsp;&nbsp;&nbsp; Let n be a multiple of 6.<br>&nbsp;&nbsp;&nbsp; n+1 might be prime.<br>&nbsp;&nbsp;&nbsp; n+2 is divisible by 2.<br>&nbsp;&nbsp;&nbsp; n+3 is divisible by 3.<br>
&nbsp;&nbsp;&nbsp; n+4 is divisible by 2.<br>&nbsp;&nbsp;&nbsp; n+5 might be prime<br>&nbsp;&nbsp;&nbsp; n+6 is another multiple of 6.<br><br>Here&#39;s a generator that uses this jumping by 6 approach:<br><br>def primes():<br>&nbsp;&nbsp;&nbsp; p = [-1, 2, 3]<br>&nbsp;&nbsp;&nbsp; for x in p: yield x<br>
&nbsp;&nbsp;&nbsp; def is_prime(n):<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for factor in p[1:]:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if factor**2 &gt; n: return True<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if n%factor == 0: return False<br>&nbsp;&nbsp;&nbsp; multiple = 6<br>&nbsp;&nbsp;&nbsp; while True:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if is_prime(multiple-1): yield multiple-1; p.append(multiple-1)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if is_prime(multiple+1): yield multiple + 1; p.append(multiple+1)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; multiple += 6<br><br>- Michel<br><br><div class="gmail_quote">On Sat, Jan 17, 2009 at 9:31 PM, kirby urner <span dir="ltr">&lt;<a href="mailto:kirby.urner@gmail.com">kirby.urner@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="Ih2E3d">On Sat, Jan 17, 2009 at 5:40 PM, Gregor Lingl &lt;<a href="mailto:gregor.lingl@aon.at">gregor.lingl@aon.at</a>&gt; wrote:<br>

&gt;<br>
&gt;<br>
&gt; kirby urner schrieb:<br>
&gt;&gt;<br>
&gt;&gt; Yes thank you I completely agree. &nbsp;A stash of sieves, plus data mine<br>
&gt;&gt; this very archive for our earlier work on this topic.<br>
&gt;&gt;<br>
&gt;&gt; My only suggestion is you include a generator version e.g.:<br>
&gt;&gt;<br>
&gt;<br>
&gt; At first this seems an attractive idea, but in my opinion the<br>
&gt; idea of sieves is fairly antagonistic to that of generators.<br>
&gt; A sieve &nbsp;is used &nbsp;to eliminate &nbsp;from a given set elements<br>
&gt; that have not some desired property, while generators<br>
&gt; (ideally) create &nbsp;objects, one at atime, &nbsp;with that desired<br>
&gt; property. Drastically: you cannot sieve at first all even<br>
&gt; numbers from an infinite set or sequence. For educational<br>
&gt; purposes I&#39;d prefer examples that display a single concept<br>
&gt; in a small and simple way. :-* &nbsp;A prime number generater<br>
&gt; based on some different algorithm of course may be<br>
&gt; interesting and useful.<br>
<br>
</div>Yes sir! &nbsp;Excellent clarification. &nbsp;The goal is to have a worthy<br>
generator that always gives the next prime. &nbsp;&quot;Trial by division&quot; is<br>
the simplest approach I can think of...<br>
<br>
&gt;&gt;&gt; def primes():<br>
 &nbsp; &nbsp; &nbsp; &nbsp;sofar = [-1, 2,3] # a running start, -1 proposed by J.H. Conway<br>
 &nbsp; &nbsp; &nbsp; &nbsp;yield sofar[0] # get these out of the way<br>
 &nbsp; &nbsp; &nbsp; &nbsp;yield sofar[1] # the only even prime<br>
 &nbsp; &nbsp; &nbsp; &nbsp;yield sofar[2] # and then 3<br>
 &nbsp; &nbsp; &nbsp; &nbsp;candidate = 5 # we&#39;ll increment from here on<br>
 &nbsp; &nbsp; &nbsp; &nbsp;while True: # go forever<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for factor in sofar[1:]: # skip -1 (or don&#39;t use it in the first place)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if factor ** 2 &gt; candidate: &nbsp;# did we pass?<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;yield candidate # woo hoo!<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sofar.append(candidate) # keep the gold<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break &nbsp;# onward!<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if not candidate % factor: # oops, no remainder<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break &nbsp;# this is a composite<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;candidate += 2 # next odd number please<br>
<div class="Ih2E3d"><br>
<br>
&gt;&gt;&gt; g = primes()<br>
&gt;&gt;&gt; next(g)<br>
-1<br>
&gt;&gt;&gt; next(g)<br>
</div><div class="Ih2E3d">2<br>
&gt;&gt;&gt; next(g)<br>
3<br>
&gt;&gt;&gt; next(g)<br>
5<br>
</div>&gt;&gt;&gt; next(g)<br>
7<br>
&gt;&gt;&gt; next(g)<br>
11<br>
&gt;&gt;&gt; next(g)<br>
13<br>
&gt;&gt;&gt; next(g)<br>
17<br>
&gt;&gt;&gt; next(g)<br>
19<br>
&gt;&gt;&gt; next(g)<br>
23<br>
&gt;&gt;&gt; next(g)<br>
29<br>
&gt;&gt;&gt; next(g)<br>
31<br>
&gt;&gt;&gt; next(g)<br>
37<br>
&gt;&gt;&gt; next(g)<br>
41<br>
<br>
I think you&#39;re correct that the sieve best works with a pre-specified<br>
finite domain: &nbsp;sieve it completely, using divisors &lt;<br>
math.sqrt(len(domain)) then iterate over it maybe, but the array is<br>
already populated, taking up memory. &nbsp;The above generator, in<br>
contrast, gradually takes up more memory (shows what generators are<br>
good for then: saving state between cycles).<br>
<div class="Ih2E3d"><br>
&gt; To continue work in this area one (or at least me) has to have<br>
&gt; some criteria to judge the solutions.<br>
&gt; Clearly it was advantageous if there was some consensus about<br>
&gt; these criteria in the community.<br>
<br>
</div>Fortunately, we have hundreds of years of math pedagogy, so in terms<br>
of avoiding quarrels, start with what&#39;s already on the books are &quot;must<br>
have&quot; and just render it Pythonically.<br>
<br>
So, for example, every pre-college math curriculum I&#39;m aware of makes<br>
the distinction between prime and composite numbers.<br>
<br>
On the other hand, few include the Fermat test or Fermat&#39;s Little<br>
Theorem, don&#39;t have RSA as a goal. &nbsp;So whereas generators for primes,<br>
fibonaccis, pascal&#39;s triangle, would seem non-controversial, anything<br>
having to do with Fermat&#39;s Little Theorem would seem an uphill battle,<br>
especially without buy in on the RSA bit.<br>
<br>
What makes a lot of this stuff more accessible than before is we have<br>
the ability to work with large numbers of digits. &nbsp;Both text books and<br>
calculators tend to crap out at more that 15 significant figures. &nbsp;Not<br>
so in Python or any significantly endowed language. &nbsp;2 ** 10000 is no<br>
problem for us, is for the paper and pencil crowd, or the TI crowd<br>
(both pitiable).<br>
<br>
I don&#39;t think there&#39;s a way to avoid quarrels. &nbsp;People have different<br>
leadings, throw their hats in the ring, and we see what synergies<br>
develop. &nbsp;My goal is to keep the process open and participatory, not<br>
to close it down. &nbsp;The sight of people debating is far less disturbing<br>
than the sight of everyone in lockstep (the Borg).<br>
<div class="Ih2E3d"><br>
&gt;<br>
&gt; There should be some criteria concerning<br>
&gt; (a) the choice of problems and themes,<br>
&gt; &nbsp; &nbsp;e.g. to prefer small problems that expose a single idea &nbsp;- &nbsp;or rather not<br>
&gt; ... &nbsp; etc.,<br>
&gt; as well as some<br>
&gt; (b) code related criteria, like clarity, conciseness, efficiency, beauty (!)<br>
&gt; etc., ranked according to<br>
&gt; their priorities.<br>
<br>
</div>This will be up to each professional teacher in whatever walk of life<br>
-- to judge what to include and what to exclude. &nbsp;Each teacher will<br>
find her or himself in agreement with some, disagreement with others,<br>
over what to include. &nbsp;Twas ever thus.<br>
<br>
What to avoid, in my book, is a restrictive environment which takes a<br>
one size fits all approach and dictates to all teachers how it must<br>
be, removing much individual freedom.<br>
<br>
Reduction in biodiversity is dangerous in my estimation.<br>
<br>
That&#39;s why I fight against &quot;national curriculum&quot; ideologues on the<br>
Math Forum, other places.<br>
<div class="Ih2E3d"><br>
&gt; Once I had the following idea: there are so many renowned pythonistas<br>
&gt; in the developers community, many of them also interested to promote<br>
&gt; Python in the educational area (see for instance the protagonists in<br>
&gt; Jeffrey Elkners &quot;Introducing Python&quot;). How about to ask them to make<br>
&gt; a personal donation to the educators and learners: a piece of code,<br>
&gt; 10 to 12 lines at most, that they individually consider &nbsp;to &nbsp;show most<br>
&gt; convincingly the power or the beauty of programming with Python -<br>
&gt; or the fun they have with it. Young people like role models ;-)<br>
&gt;<br>
<br>
</div>That&#39;s a fun idea.<br>
<br>
Another approach is to start some schools in which Python is defacto<br>
included as an important tool in the math curriculum, and compete with<br>
other schools that make different choices, see how that goes.<br>
<br>
Don&#39;t try to &quot;convince the world&quot; before starting your experiment.<br>
<br>
You need no one&#39;s permission to take the initiative.<br>
<br>
Individuals make all the difference in this world, alone and in groups.<br>
<div class="Ih2E3d"><br>
&gt; Regrettably I didn&#39;t persue that idea further. What do you think of it. Ok,<br>
&gt; the days of the early pioneers are over, but perhaps it&#39;s still worth a try?<br>
&gt;<br>
<br>
</div>I think the first generation of Pythoneers, counting myself as one of<br>
them, should be collecting momentos and souvenirs, as soon enough our<br>
generation will no longer be heard from, in terms of contributing new<br>
material.<br>
<br>
Your idea reminds me of the recipe book they made for Bucky Fuller,<br>
his many friends contributing their favorites.<br>
<br>
Looking back at 2008, random geek viewpoint:<br>
<a href="http://www.iht.com/articles/2008/12/22/arts/design22.php" target="_blank">http://www.iht.com/articles/2008/12/22/arts/design22.php</a><br>
<font color="#888888"><br>
Kirby<br>
</font><div><div></div><div class="Wj3C7c"><br>
<br>
&gt; Regards,<br>
&gt; Gregor<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; Using Python 3:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; g = Primes()<br>
&gt;&gt;&gt;&gt;&gt; next(g)<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; -1<br>
&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; next(g)<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; ....<br>
&gt;&gt;<br>
&gt;<br>
</div></div></blockquote></div><br>