DSPython  00.03.03 — 25 juin 2012
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Pages
naturalstable.py
Aller à la documentation de ce fichier.
1 #!/usr/bin/env python
2 # -*- coding: latin-1 -*-
3 ##\file
4 # Script créant une table HTML des naturels
5 # avec les valeurs de différentes fonctions arithmétiques
6 #
7 # Cf. \htmlonly <a href="http://www.opimedia.be/naturels/" target="_blank">
8 # <tt>http://www.opimedia.be/naturels/</tt></a>\endhtmlonly
9 
10 # (c) Olivier Pirson --- DragonSoft
11 # http://www.opimedia.be/DS/
12 # Débuté fin 2006
13 # v.01.00 --- 12 mai 2007
14 # --- 14 november 2007
15 # --- 2 mars 2008
16 # v.01.01 --- 18 juin 2008 : correction &piv;(0) = 0
17 # v.01.02 --- 13 novembre 2008 : // à la place de / et tests des types
18 # v.01.03 --- 29 septembre 2009 : nouveau site web, changement print()
19 # v.01.04 --- 14 décember 2009 : from __future__ import division
20 # v.01.05 --- 16 mars 2010 : nouveau site web et changement des % en .format()
21 # --- 12 avril 2010 : cfr. -> cf.
22 ###############################################################################
23 from __future__ import division
24 from __future__ import print_function
25 
26 ## Version
27 VERSION = 'v.01.05 --- 2010 April 12'
28 
29 import math, numbers, sys, time
30 
31 import DSPython
32 import DSPython.factors as factors
33 import DSPython.natural as natural
34 import DSPython.nbsystem as nbsystem
35 
36 try:
37  if not 'profile' in dir():
38  import psyco
39  psyco.full()
40 except ImportError:
41  pass
42 
43 
44 
45 # ############
46 # Constantes #
47 ##############
48 ## Titre pour n
49 N = 'n&thinsp;'
50 
51 
52 ## Caractère infini (en gris)
53 INFIN = '<font color="gray">&infin;</font>'
54 
55 ## Caractère N, ensemble des naturels
56 NATURALS = '&#8469;'
57 
58 ## Caractère ~ (en petit)
59 SIM = '<font size="-2">&sim;</font>'
60 
61 ## Caractère x (en gris)
62 X = '<font color="gray" face="Arial">x</font>'
63 
64 
65 ## Pour aligner une cellule à gauche
66 LEFT = 1
67 
68 ## Pour aligner une cellule à droite
69 RIGHT = 0
70 
71 
72 
73 # ###########
74 # Fonctions #
75 #############
76 ## Renvoie sous forme de string les diviseurs du naturel correspondant aux primaries p
77 def divisors_str(p):
78  """Renvoie sous forme de string les diviseurs du naturel correspondant aux primaries p
79 
80  Pre: p: 0 ou primaries"""
81  assert (p == 0) or factors.primaries_is(p), p
82 
83  if p != 0:
84  ld = natural.divisors(factors.primaries_to_n(p))
85  l = []
86  for d in ld:
87  l.append(n_to_href(d))
88  return ','.join(l)
89  else:
90  return NATURALS
91 
92 
93 ## Renvoie sous forme de string les facteurs premiers du naturel correspondant aux primaries p
94 def factors_str(p):
95  """Renvoie sous forme de string les facteurs premiers du naturel correspondant aux primaries p
96 
97  Pre: p: 0 ou primaries"""
98  assert (p == 0) or factors.primaries_is(p), p
99 
100  if p != 0:
101  f_l = []
102  for f_n in p:
103  if f_n[1] > 1:
104  f_l.append('{0}<sup>{1}</sup>'.format(n_to_href(f_n[0]), n_to_href(f_n[1])))
105  else:
106  f_l.append(n_to_href(f_n[0]))
107  f_str = '.'.join(f_l)
108  return(f_str if f_str != ''
109  else '&nbsp;')
110  else:
111  return X
112 
113 
114 ##\brief Affiche le message d'aide sur la sortie des erreurs
115 ## et termine le programme par un code d'erreur 1
116 def help_msg():
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]]
120 
121  HTML table of naturals and arithmetic functions on standard output
122  (c) Olivier Pirson --- DragonSoft --- {0}
123  {1}
124  Options: to: last natural [50]
125  from: first natural [0]
126  -nothref: HTML links
127  --help: print this message on error output and exit
128 
129 
130  Infos:
131  {2}
132  Python {3}""".format(DSPython.DS_web, VERSION, DSPython.VERSION, sys.version),
133  file=sys.stderr)
134  sys.exit(1)
135 
136 
137 ## Renvoie n (dans un notation réduite si n est trop grand)
138 def n_to_big(n):
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))
143  k = s.find('e')
144  e = s[k + 2:].lstrip('0')
145  s = s[:k]
146  k = s.find('.')
147  if k >= 0:
148  s = s[:k]
149  return SIM + s + '.10<sup>' + e + '</sup>'
150  else:
151  return n
152 
153 
154 ## Renvoie True si p est les primaries d'un nombre premier, False sinon
155 def prime_is(p):
156  """Renvoie True si p est les primaries d'un nombre premier, False sinon
157 
158  Pre: p: 0 ou primaries"""
159  assert (p == 0) or factors.primaries_is(p), p
160 
161  return (p != 0) and factors.primaries_prime_is(p)
162 
163 
164 ## Envoie sur la sortie standard la fin du document HTML
165 def print_html_footer():
166  """Envoie sur la sortie standard la fin du document HTML"""
167  print("""</body>
168 </html>""")
169 
170 
171 ## Envoie sur la sortie standard l'en-tête 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
174 
175  Pre: n_from: naturel <= n_to
176  n_to: naturel"""
177  assert DSPython.natural_is(n_from), n_from
178  assert DSPython.natural_is(n_to), n_to
179  assert n_from <= n_to, (n_from, n_to)
180 
181  print("""<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
182 <html lang="fr">
183 <head>
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">
192 
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>
196 </head>
197 
198 <body>""".format(time.strftime('%Y%m%d'), n_from, n_to, VERSION, DSPython.DS_web, n_from, n_to))
199 
200 
201 ## Envoie sur la sortie standard la table HTML
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
205 
206  Pre: n_from: naturel <= n_to
207  n_to: naturel
208  href: valeur booléenne"""
209  assert DSPython.natural_is(n_from), n_from
210  assert DSPython.natural_is(n_to), n_to
211  assert n_from <= n_to, (n_from, n_to)
212 
213  global n_to_href
214  if href:
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"""
219  if name:
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))
223  else:
224  return str(n_to_big(n))
225  else:
226  def n_to_href(n, name=False):
227  """Renvoie n sous forme de string"""
228  return str(n_to_big(n))
229 
230  # Initialise quelques valeurs pour pouvoir commencer à n_from
231  ## Somme des fonctions de Liouville (fonction L)
232  global _liouville_sum
233  ## Fonction M de Mertens
234  global _mertens
235  ## Fonction pi
236  global _pi
237 
238  _pi = 0
239  _mertens = 0
240  _liouville_sum = 0
241  for n in range(1, n_from):
242  p = factors.primaries(n)
243  if prime_is(p):
244  _pi +=1
245  _mertens += factors.mobius(p)
246  _liouville_sum += (-1)**len(factors.primaries_to_primes(p))
247 
248  print_html_table_header(n_from=n_from, n_to=n_to)
249  print_html_title_line()
250  print('<tr><td></td></tr>')
251 
252  # Lignes de la table
253  for n in range(n_from, n_to + 1):
254  p = (0 if n==0
255  else factors.primaries(n))
256  if prime_is(p):
257  _pi += 1
258  if n > 0:
259  _liouville_sum += (-1)**len(factors.primaries_to_primes(p))
260  _mertens += factors.mobius(p)
261  line = '<tr align="right">'
262  # Colonnes de la table
263  for i in range(len(L)):
264  col = L[i]
265  if col[0] == '': # colonne vide
266  line += '<td></td>'
267  continue
268  if (len(col) >= 3) and (col[2] == LEFT): # colonne alignée à gauche
269  begin = '<td align="left">'
270  else: # colonne normale
271  begin = '<td>'
272  end = '</td>'
273  if len(col) >= 5: # pour smaller
274  begin += col[3]
275  end = col[4] + end
276 
277  v = col[1](p) # valeur telle que renvoyée par la fonction de L
278  s = n_to_href(v, name=col[0]==N) # valeur dans un string avec lien HTML s'il le faut
279 
280  if ((col[0] != N) and (v == n)) or ((col[0] == N) and prime_is(p)): # en gras
281  begin += '<b>'
282  end = '</b>' + end
283  elif v == 0: # en gris
284  begin += '<font color="gray">'
285  end = '</font>' + end
286  line += begin + s + end
287  print(line + '</tr>')
288  print_html_table_footer()
289 
290 
291 ## Envoie sur la sortie standard la fin de la table HTML
292 def print_html_table_footer():
293  """Envoie sur la sortie standard la fin de la table HTML"""
294  print('</table>')
295 
296 
297 ## Envoie sur la sortie standard le début 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
300 
301  Pre: n_from: naturel <= n_to
302  n_to: naturel"""
303  assert DSPython.natural_is(n_from), n_from
304  assert DSPython.natural_is(n_to), n_to
305  assert n_from <= n_to, (n_from, n_to)
306 
307  print('<table border="1" cellpadding="0" cellspacing="0" summary="table {0} à {1}">'
308  .format(n_from, n_to))
309 
310 
311 ## Envoie sur la sortie standard la ligne de titre de la table HTML
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)):
316  col = L[i]
317  s = col[0]
318  if s == '': # colonne vide
319  line += '<td></td>'
320  else:
321  line += '<td{0}>{1}</td>'.format(' align="left"' if (len(col) >= 3) and (col[2] == LEFT)
322  else '', s)
323  print(line + '</tr>')
324 
325 
326 ##\brief Fonction sigma<sub>-1</sub>,
327 ## la somme des inverses des diviseurs du naturel correspondant aux primaries p
328 def sigma_1(p):
329  """Fonction sigma_(-1),
330  la somme des inverses des diviseurs du naturel correspondant aux primaries p
331 
332  Pre: p: 0 ou primaries"""
333  assert (p == 0) or factors.primaries_is(p), p
334 
335  if p != 0:
336  n = factors.primaries_to_n(p)
337  r = factors.divisors_sum(p) / n
338  if math.floor(r) == r:
339  r = int(r)
340  else:
341  r = ('{0:.2f}'.format(r)).rstrip('0')
342  if float(r)*n != factors.divisors_sum(p):
343  r = SIM + r
344  return r
345  else:
346  return INFIN
347 
348 
349 
350 # ######\cond MAIN
351 # Main #
352 ########
353 ## Premier naturel de la table
354 n_from = 0
355 
356 ## Dernier naturel de la table
357 n_to = 50
358 
359 
360 ## Si True alors ajoute des liens HTML
361 href = True
362 
363 
364 ## Avant un élément pour réduire sa taille
365 begin_smaller = ''
366 
367 ## Après un élément pour réduire sa taille
368 end_smaller = ''
369 
370 
371 ## Liste des paramètres numériques
372 params = []
373 for i in range(1, len(sys.argv)): # parcours les paramètres
374  if sys.argv[i] == '-nothref':
375  href = False
376  elif sys.argv[i].lower() == '--help':
377  help_msg()
378  else:
379  try:
380  params.append(int(sys.argv[i]))
381  except:
382  help_msg()
383 
384 if len(params) >= 1:
385  n_to = params[0]
386  if len(params) >= 2:
387  n_from = params[1]
388 
389 if n_to >= 100:
390  begin_smaller = '<font size="-2">'
391  end_smaller = '</font>'
392 
393 
394 ## Tuple des fonctions de la table
395 ## ('titre', fonction à partir des primaries, align, 'début smaller', 'fin smaller')
396 L = ((N, lambda p: (0 if p==0
397  else factors.primaries_to_n(p))),
398  ('', ),
399  ('facteurs', factors_str, LEFT),
400  ('&pi;(n)', lambda p: _pi),
401  ('&omega;(n)', lambda p: (INFIN if p==0
402  else len(p))),
403  ('&Omega;(n)', lambda p: (INFIN if p==0
404  else len(factors.primaries_to_primes(p)))),
405  ('&sigma;<sub>-1</sub>(n)', sigma_1),
406  ('&nu;(n)', lambda p: (INFIN if p==0
407  else factors.divisors_nb(p))),
408  ('&sigma;(n)', lambda p: (INFIN if p==0
409  else factors.divisors_sum(p))),
410  ('&sigma;<sub>i</sub>(n)', lambda p: (INFIN if p==0
411  else factors.divisors_sum_odd(p))),
412  ('&sigma;<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  ('&piv;(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  ('&phi;(n)', lambda p: (1 if p==0
421  else factors.totient(p))),
422  ('&lambda;(n)', lambda p: (X if p==0
423  else (-1)**len(factors.primaries_to_primes(p)))),
424  ('L(n)', lambda p: _liouville_sum),
425  ('&mu;(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))
444 
445 
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)
448 print_html_footer()
449 ##\endcond MAIN