23 from __future__
import division
24 from __future__
import print_function
27 VERSION =
'v.01.05 --- 2010 April 12'
29 import math, numbers, sys, time
37 if not 'profile' in dir():
53 INFIN =
'<font color="gray">∞</font>'
59 SIM =
'<font size="-2">∼</font>'
62 X =
'<font color="gray" face="Arial">x</font>'
78 """Renvoie sous forme de string les diviseurs du naturel correspondant aux primaries p
80 Pre: p: 0 ou primaries"""
81 assert (p == 0)
or factors.primaries_is(p), p
84 ld = natural.divisors(factors.primaries_to_n(p))
87 l.append(n_to_href(d))
95 """Renvoie sous forme de string les facteurs premiers du naturel correspondant aux primaries p
97 Pre: p: 0 ou primaries"""
98 assert (p == 0)
or factors.primaries_is(p), p
104 f_l.append(
'{0}<sup>{1}</sup>'.format(n_to_href(f_n[0]), n_to_href(f_n[1])))
106 f_l.append(n_to_href(f_n[0]))
107 f_str =
'.'.join(f_l)
108 return(f_str
if f_str !=
''
117 """Affiche le message d'aide sur la sortie des erreurs
118 et termine le programme par un code d'erreur 1"""
119 print(
"""naturalstable [-nothref] [to [from]]
121 HTML table of naturals and arithmetic functions on standard output
122 (c) Olivier Pirson --- DragonSoft --- {0}
124 Options: to: last natural [50]
125 from: first natural [0]
127 --help: print this message on error output and exit
132 Python {3}""".format(DSPython.DS_web, VERSION, DSPython.VERSION, sys.version),
139 """Renvoie n (dans un notation réduite si n est trop grand)
140 pre: n: quelconque"""
141 if isinstance(n, numbers.Number)
and (n >= 10**9):
142 s =
'{0:g}'.format(float(n))
144 e = s[k + 2:].lstrip(
'0')
149 return SIM + s +
'.10<sup>' + e +
'</sup>'
156 """Renvoie True si p est les primaries d'un nombre premier, False sinon
158 Pre: p: 0 ou primaries"""
159 assert (p == 0)
or factors.primaries_is(p), p
161 return (p != 0)
and factors.primaries_prime_is(p)
165 def print_html_footer():
166 """Envoie sur la sortie standard la fin du document HTML"""
172 def print_html_header(n_from=2, n_to=50):
173 """Envoie sur la sortie standard l'en-tête du document HTML
175 Pre: n_from: naturel <= n_to
179 assert n_from <= n_to, (n_from, n_to)
181 print(
"""<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
184 <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
185 <meta name="author" content="Olivier Pirson">
186 <meta name="date-revision-yyyymmdd" content="{0}">
187 <meta name="description" content="table des naturels (de {1} à {2}) avec leur décomposition en facteurs premiers...
188 (générée par DSPython/naturalstable.py
189 --- {3} --- DragonSoft --- {4})">
190 <meta name="keywords" content="naturels, facteurs premiers, sigma, totient">
191 <meta name="keywords" lang="en" content="naturals, prime factors, sigma, totient">
193 <title>Table des naturels (de {5} à {6})
194 avec leur décomposition en facteurs premiers et fonctions associées</title>
195 <style type="text/css"><!--a {{color:inherit;text-decoration:none}}--></style>
198 <body>""".format(time.strftime(
'%Y%m%d'), n_from, n_to, VERSION, DSPython.DS_web, n_from, n_to))
202 def print_html_table(n_from=0, n_to=50, href=True):
203 """Envoie sur la sortie standard la table HTML.
204 Si href alors des liens HTML sont créés pour les naturels considérés
206 Pre: n_from: naturel <= n_to
208 href: valeur booléenne"""
211 assert n_from <= n_to, (n_from, n_to)
215 def n_to_href(n, name=False):
216 """Renvoie n sous forme de string en ajoutant le lien HTML
217 si n est un naturel accessible.
218 Si name alors ajoute l'ancre et le lien HTML"""
220 return '<a name="{0}" href="#{1}">{2}</a>'.format(n, n, n_to_big(n))
221 elif isinstance(n, numbers.Number)
and (n_from <= n <= n_to)
and (int(n) == n):
222 return '<a href="#{0}">{1}</a>'.format(n, n_to_big(n))
224 return str(n_to_big(n))
226 def n_to_href(n, name=False):
227 """Renvoie n sous forme de string"""
228 return str(n_to_big(n))
232 global _liouville_sum
241 for n
in range(1, n_from):
242 p = factors.primaries(n)
245 _mertens += factors.mobius(p)
246 _liouville_sum += (-1)**len(factors.primaries_to_primes(p))
248 print_html_table_header(n_from=n_from, n_to=n_to)
249 print_html_title_line()
250 print(
'<tr><td></td></tr>')
253 for n
in range(n_from, n_to + 1):
255 else factors.primaries(n))
259 _liouville_sum += (-1)**len(factors.primaries_to_primes(p))
260 _mertens += factors.mobius(p)
261 line =
'<tr align="right">'
263 for i
in range(len(L)):
268 if (len(col) >= 3)
and (col[2] == LEFT):
269 begin =
'<td align="left">'
278 s = n_to_href(v, name=col[0]==N)
280 if ((col[0] != N)
and (v == n))
or ((col[0] == N)
and prime_is(p)):
284 begin +=
'<font color="gray">'
285 end =
'</font>' + end
286 line += begin + s + end
287 print(line +
'</tr>')
288 print_html_table_footer()
292 def print_html_table_footer():
293 """Envoie sur la sortie standard la fin de la table HTML"""
298 def print_html_table_header(n_from=2, n_to=50):
299 """Envoie sur la sortie standard le début de la table HTML
301 Pre: n_from: naturel <= n_to
305 assert n_from <= n_to, (n_from, n_to)
307 print(
'<table border="1" cellpadding="0" cellspacing="0" summary="table {0} à {1}">'
308 .format(n_from, n_to))
312 def print_html_title_line():
313 """Envoie sur la sortie standard la ligne de titre de la table HTML"""
314 line =
'<tr align="right">'
315 for i
in range(len(L)):
321 line +=
'<td{0}>{1}</td>'.format(
' align="left"' if (len(col) >= 3)
and (col[2] == LEFT)
323 print(line +
'</tr>')
329 """Fonction sigma_(-1),
330 la somme des inverses des diviseurs du naturel correspondant aux primaries p
332 Pre: p: 0 ou primaries"""
333 assert (p == 0)
or factors.primaries_is(p), p
336 n = factors.primaries_to_n(p)
337 r = factors.divisors_sum(p) / n
338 if math.floor(r) == r:
341 r = (
'{0:.2f}'.format(r)).rstrip(
'0')
342 if float(r)*n != factors.divisors_sum(p):
373 for i
in range(1, len(sys.argv)):
374 if sys.argv[i] ==
'-nothref':
376 elif sys.argv[i].lower() ==
'--help':
380 params.append(int(sys.argv[i]))
390 begin_smaller =
'<font size="-2">'
391 end_smaller =
'</font>'
396 L = ((N,
lambda p: (0
if p==0
397 else factors.primaries_to_n(p))),
399 (
'facteurs', factors_str, LEFT),
400 (
'π(n)',
lambda p: _pi),
401 (
'ω(n)',
lambda p: (INFIN
if p==0
403 (
'Ω(n)',
lambda p: (INFIN
if p==0
404 else len(factors.primaries_to_primes(p)))),
405 (
'σ<sub>-1</sub>(n)', sigma_1),
406 (
'ν(n)',
lambda p: (INFIN
if p==0
407 else factors.divisors_nb(p))),
408 (
'σ(n)',
lambda p: (INFIN
if p==0
409 else factors.divisors_sum(p))),
410 (
'σ<sub>i</sub>(n)',
lambda p: (INFIN
if p==0
411 else factors.divisors_sum_odd(p))),
412 (
'σ<sub>p</sub>(n)',
lambda p: (INFIN
if p==0
413 else factors.divisors_sum_even(p))),
414 (
's(n)',
lambda p: (INFIN
if p==0
415 else factors.properdivisors_sum(p))),
416 (
'ϖ(n)',
lambda p: (0
if p==0
417 else factors.divisors_prod(p))),
418 (
'GR(n)',
lambda p: (1
if p==0
419 else factors.nb_in_integers_4sqr(p))),
420 (
'φ(n)',
lambda p: (1
if p==0
421 else factors.totient(p))),
422 (
'λ(n)',
lambda p: (X
if p==0
423 else (-1)**len(factors.primaries_to_primes(p)))),
424 (
'L(n)',
lambda p: _liouville_sum),
425 (
'μ(n)',
lambda p: (X
if p==0
426 else factors.mobius(p))),
427 (
'M(n)',
lambda p: _mertens),
428 (
'<span style="font-size:smaller;text-decoration:overline"><font>'
429 +
'n</font></span><sup><sup>F</sup></sup>',
430 lambda p: (
'0' if p==0
431 else natural.bin(nbsystem.fibonacci(factors.primaries_to_n(p)))),
432 RIGHT, begin_smaller, end_smaller),
433 (
'<span style="font-size:smaller;text-decoration:overline"><font>'
434 +
'n</font></span><sup><sup>2</sup></sup>',
435 lambda p: (
'0' if p==0
436 else natural.bin(factors.primaries_to_n(p))),
437 RIGHT, begin_smaller, end_smaller),
438 (
'<span style="font-size:smaller;text-decoration:overline"><font>'
439 +
'n</font></span><sup><sup>3</sup></sup>',
440 lambda p: (
'0' if p==0
441 else nbsystem.to_str(factors.primaries_to_n(p), b=3)),
442 RIGHT, begin_smaller, end_smaller),
443 (
'diviseurs', divisors_str, LEFT, begin_smaller, end_smaller))
446 print_html_header(n_from=n_from, n_to=n_to)
447 print_html_table(n_from=n_from, n_to=n_to, href=href)