DSPython  00.03.03 — 25 juin 2012
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Pages
integer.py
Aller à la documentation de ce fichier.
1 #!/usr/bin/env python
2 # -*- coding: latin-1 -*-
3 ##\package DSPython.integer Entiers : fonctions arithmétiques
4 
5 ##\file
6 # Entiers : fonctions arithmétiques
7 
8 # (c) Olivier Pirson --- DragonSoft
9 # http://www.opimedia.be/DS/
10 # Débuté le 9 juillet 2006
11 ####################################
12 from __future__ import print_function
13 
14 ## Date du dernier changement pour ce module
15 VERSION = 'integer --- 2010 March 16'
16 
17 import numbers, types
18 
19 import DSPython.natural as natural
20 
21 
22 
23 # ###########
24 # Fonctions #
25 #############
26 ## n en binaire dans un string
27 def bin(n, sign=False):
28  """Renvoie un string représentant n en binaire
29  (Si n == 0 alors renvoie '0' ou '+0' si sign=True)
30  Si n < 0
31  alors renvoie la représentation de -n précédée du caractère '-'
32  Si sign == True
33  alors ajoute toujours le signe même si c'est '+'
34 
35  Pre: n: Integral
36 
37  Result: string
38 
39  O(n) = lg(n)"""
40  assert isinstance(n, numbers.Integral), n
41 
42  if n < 0:
43  sign = '-'
44  n = -n
45  elif sign:
46  sign = '+'
47  else:
48  sign = ''
49  return sign + natural.bin(n)
50 
51 
52 ## Coefficient binomial de n et k
53 def binom(n, k):
54  """Renvoie le coefficient binomial (n)
55  (k)
56 
57  Pre: n: Integral
58  k: Integral
59 
60  Result: naturel
61 
62  O(n, k) = ..."""
63  assert isinstance(n, numbers.Integral), n
64  assert isinstance(k, numbers.Integral), k
65 
66  if n < 0:
67  raise NotImplementedError
68  return (natural.binom(n, k) if k >= 0
69  else 0)
70 
71 
72 ## F<sub>k</sub>
73 def fibonacci(k):
74  """Renvoie F_k, le kième nombre de Fibonacci
75 
76  Pre: k: Integral
77 
78  Result: Integral
79 
80  O(k) = ..."""
81  assert isinstance(k, numbers.Integral), k
82 
83  return fibonacci2(k)[1]
84 
85 
86 ## (F<sub>k-1</sub>, F<sub>k</sub>)
87 def fibonacci2(k):
88  """Renvoie (F_(k-1), F_k), les (k-1)ième et kième nombres de Fibonacci
89 
90  Pre: k: Integral
91 
92  Result: couple d'Integral
93 
94  O(k) = ..."""
95  assert isinstance(k, numbers.Integral), k
96 
97  if k >= 0:
98  return natural.fibonacci2(k)
99  else:
100  f2 = natural.fibonacci2(-k + 1)
101  return ((f2[1], -f2[0]) if k&1 == 0
102  else (-f2[1], f2[0]))
103 
104 
105 ## n est un nombre de Fibonacci ?
107  """Renvoie True si n est un nombre de Fibonacci,
108  False sinon
109 
110  Pre: n: Integral
111 
112  Result: booleen
113 
114  O(n) = ..."""
115  assert isinstance(n, numbers.Integral), n
116 
117  if n >= 0:
118  return natural.fibonacci_is(n)
119  elif n != -1:
120  k = natural.fibonacci_to_index(-n)
121  return k != None and k&1 == 0
122  else:
123  return True
124 
125 
126 ## Indice du nombre de Fibonacci correspondant à n
128  """Si n == F_k alors renvoie k
129  (si n == 1 alors renvoie toujours 1, jamais 2
130  et si n >= 0 alors renvoie toujours le k positif,
131  jamais le négatif),
132  sinon renvoie None
133 
134  Pre: n Integral
135 
136  Result: Integral
137 
138  O(n) = ..."""
139  assert isinstance(n, numbers.Integral), n
140 
141  if n >= 0:
142  return natural.fibonacci_to_index(n)
143  elif n != -1:
144  k = natural.fibonacci_to_index(-n)
145  return (-k if (k != None) and (k&1 == 0)
146  else None)
147  else:
148  return -2
149 
150 
151 ## f(k)
152 def fibonacci_gen(f_0, f_1, k):
153  """Renvoie f(k),
154  la valeurs en k de la fonction f de Fibonacci
155  (c.-à-d. telle que f(n+2) = f(n) + f(n+1))
156  de conditions initiales f(0) == f_0 et f(1) == f_1
157 
158  Pre: f_0: Integral
159  f_1: Integral
160  k: Integral
161 
162  Result: Integral
163 
164  O(k) = ..."""
165  assert isinstance(f_0, numbers.Integral), f_0
166  assert isinstance(f_1, numbers.Integral), f_1
167  assert isinstance(k, numbers.Integral), k
168 
169  return fibonacci2_gen(f_0, f_1, k)[1]
170 
171 
172 ## (f(k-1), f(k))
173 def fibonacci2_gen(f_0, f_1, k):
174  """Renvoie (f(k-1), f(k)),
175  les valeurs en k-1 et k de la fonction f de Fibonacci
176  (c.-à-d. telle que f(n+2) = f(n) + f(n+1))
177  de conditions initiales f(0) == f_0 et f(1) == f_1
178 
179  Pre: f_0: Integral
180  f_1: Integral
181  k: Integral
182 
183  Result: couple d'Integral
184 
185  O(k) = ..."""
186  assert isinstance(f_0, numbers.Integral), f_0
187  assert isinstance(f_1, numbers.Integral), f_1
188  assert isinstance(k, numbers.Integral), k
189 
190  Fk_2, Fk_1 = fibonacci2(k - 1)
191  return (Fk_2*f_0 + Fk_1*f_1,
192  Fk_1*f_0 + (Fk_1 + Fk_2)*f_1)
193 
194 
195 ## L<sub>k</sub>
196 def lucas(k):
197  """Renvoie L_k, le kième nombre de Lucas
198 
199  Pre: k: Integral
200 
201  Result: Integral
202 
203  O(k) = ..."""
204  assert isinstance(k, numbers.Integral), k
205 
206  Fk_1, Fk = fibonacci2(k)
207  return (Fk_1 << 1) + Fk
208 
209 
210 ## (L<sub>k-1</sub>, L<sub>k</sub>)
211 def lucas2(k):
212  """Renvoie (L_(k-1), L_k), les (k-1)ième et kième nombres de Lucas
213 
214  Pre: k: Integral
215 
216  Result: couple d'Integral
217 
218  O(k) = ..."""
219  assert isinstance(k, numbers.Integral), k
220 
221  Fk_2, Fk_1= fibonacci2(k - 1)
222  Fk = Fk_1 + Fk_2
223  return (Fk + Fk_2, (Fk_1 << 1) + Fk)
224 
225 
226 ## n est un nombre de Lucas ?
227 def lucas_is(n):
228  """Renvoie True si n est un nombre de Lucas,
229  False sinon
230 
231  Pre: n: Integral
232 
233  Result: booleen
234 
235  O(n) = ..."""
236  assert isinstance(n, numbers.Integral), n
237 
238  if n >= 0:
239  return natural.lucas_is(n)
240  else:
241  k = natural.lucas_to_index(-n)
242  return k != None and k&1 != 0
243 
244 
245 ## Indice du nombre de Lucas correspondant à n
247  """Si n == F_k alors renvoie k
248  (si n == 1 alors renvoie toujours 1, jamais 2
249  et si n >= 0 alors renvoie toujours le k positif,
250  jamais le négatif),
251  sinon renvoie None
252 
253  Pre: n Integral
254 
255  Result: Integral
256 
257  O(n) = ..."""
258  assert isinstance(n, numbers.Integral), n
259 
260  if n >= 0:
261  return natural.lucas_to_index(n)
262  else:
263  k = natural.lucas_to_index(-n)
264  return (-k if (k != None) and (k&1 != 0)
265  else None)
266 
267 
268 ## Produit des valeurs de f évaluée sur les éléments de s
269 def prod(f, s):
270  """Produit des valeurs de f évaluée sur les éléments de s
271 
272  Pre: f: fonction à un paramètre Integral, renvoyant un Integral
273  s: collection d'Integral sur lesquels f est définie
274 
275  Result: Integral
276 
277  O(f, s) = ..."""
278  assert isinstance(f, types.FunctionType), type(f)
279 
280  r = 1
281  for i in s:
282  r *= f(i)
283  if r == 0:
284  return 0
285  return r
286 
287 
288 ## Somme des valeurs de f évaluée sur les éléments de s
289 def sum(f, s):
290  """Somme des valeurs de f évaluée sur les éléments de s
291 
292  Pre: f: fonction à un paramètre Integral, renvoyant un Integral
293  s: collection d'Integral sur lesquels f est définie
294 
295  Result: Integral
296 
297  O(f, s) = ..."""
298  assert isinstance(f, types.FunctionType), type(f)
299 
300  r = 0
301  for i in s:
302  r += f(i)
303  return r
304 
305 
306 
307 # ######\cond MAINTEST
308 # Main #
309 ########
310 if __name__ == '__main__':
311  def main_test():
312  """Test du module"""
313  import sys
314 
315  import math
316 
317  try:
318  if not 'profile' in dir():
319  import psyco
320  psyco.full()
321  except ImportError:
322  pass
323 
324  import DSPython.debug as debug
325  import DSPython.natseq as natseq
326 
327  debug.test_begin(VERSION, __debug__)
328 
329  print('bin()...', end=''); sys.stdout.flush()
330  assert bin(-1) == '-1', bin(1)
331  assert bin(0) == '0', bin(0)
332  assert bin(1) == '1', bin(1)
333 
334  assert bin(-1, False) == '-1', bin(-1, False)
335  assert bin(0, False) == '0', bin(0, False)
336  assert bin(1, False) == '1', bin(1, False)
337 
338  assert bin(-1, True) == '-1', bin(-1, True)
339  assert bin(0, True) == '+0', bin(0, True)
340  assert bin(1, True) == '+1', bin(1, True)
341  for i in range(1, 50):
342  assert bin(2**i - 1) == '1'*i, (i, bin(2**i - 1)) # 1...11
343  assert bin(2**i) == '1' + '0'*i, (i, bin(2**i)) # 10...00
344  assert bin(2**i + 1) == '1' + '0'*(i - 1) + '1', (i, bin(2**i + 1)) # 10...01
345  for n in range(-16384, 16384):
346  assert int(bin(n), 2) == n, (n, bin(n))
347  for n in range(1, 2**40, 1000000000):
348  assert int(bin(n), 2) == n, (n, bin(n))
349  for n in range(2**32 - 16384, 2**32 + 16384):
350  assert int(bin(n), 2) == n, (n, bin(n))
351  print('ok'); sys.stdout.flush()
352 
353 
354  print('binom()...', end=''); sys.stdout.flush()
355  for n in range(100):
356  assert binom(n, 0) == 1, (n, binom(n, 0))
357  assert binom(n, 1) == n, (n, binom(n, 1))
358  for k in range(1, 10):
359  assert binom(n, n+k) == 0, (n, k, binom(n, n+k))
360  s = 0
361  for k in range(n + 1):
362  s += binom(n, k)
363  assert s == 2**n, (n, s, 2**n)
364  for n in range(1, 50):
365  for k in range(1, n + 1):
366  assert binom(n, k) == binom(n, n - k), (n, k, binom(n, k), binom(n, n - k))
367  assert binom(n, k) == binom(n - 1, k - 1) * n // k, \
368  (n, k, binom(n, k), binom(n - 1, k - 1))
369  assert binom(n, k) == binom(n, k - 1) * (n - k + 1) // k, \
370  (n, k, binom(n, k), binom(n, k - 1) * (n - k + 1))
371  for n in range(3, 100):
372  assert binom(n, 2) == ((n - 1)*n)//2, (n, binom(n, 2), ((n - 1)*n)//2)
373  print('ok'); sys.stdout.flush()
374 
375 
376  print('fibonacci()...', end=''); sys.stdout.flush()
377  Fk_1 = 1
378  Fk = 0
379  for k in range(5000):
380  assert fibonacci(k) == Fk, (k, fibonacci(k))
381  Fk_1, Fk = Fk, Fk + Fk_1
382  Fk_1 = 1
383  Fk = 0
384  for k in range(0, -1000, -1):
385  assert fibonacci(k) == Fk, (k, fibonacci(k))
386  Fk_1, Fk = Fk - Fk_1, Fk_1
387  print('ok'); sys.stdout.flush()
388 
389 
390  print('fibonacci2()...', end=''); sys.stdout.flush()
391  Fk_1 = 1
392  Fk = 0
393  for k in range(5000):
394  assert fibonacci2(k) == (Fk_1, Fk), (k, fibonacci2(k))
395  Fk_1, Fk = Fk, Fk + Fk_1
396  Fk_1 = 1
397  Fk = 0
398  for k in range(0, -1000, -1):
399  assert fibonacci2(k) == (Fk_1, Fk), (k, fibonacci2(k))
400  Fk_1, Fk = Fk - Fk_1, Fk_1
401  print('ok'); sys.stdout.flush()
402 
403 
404  print('fibonacci_is()...', end=''); sys.stdout.flush()
405  assert not fibonacci_is(-5)
406  assert not fibonacci_is(-4)
407  assert fibonacci_is(-3)
408  assert not fibonacci_is(-2)
409  assert fibonacci_is(-1)
410  assert fibonacci_is(0)
411  assert fibonacci_is(1)
412  assert fibonacci_is(2)
413  assert fibonacci_is(3)
414  assert not fibonacci_is(4)
415  for k in range(-1000, 1000):
416  assert fibonacci_is(fibonacci(k)), (k, fibonacci(k))
417  for n in range(-16384, 16384):
418  if fibonacci_is(n):
419  assert -46 <= fibonacci_to_index(n) <= 47, (n, fibonacci_to_index(n))
420  else:
421  assert fibonacci_to_index(n) == None, (n, fibonacci_to_index(n))
422  if debug.assertspeed >= debug.ASSERT_NORMAL:
423  for n in range(-(2**45), 2**45, 1000000000):
424  if fibonacci_is(n):
425  assert -46 <= fibonacci_to_index(n) <= 47, (n, fibonacci_to_index(n))
426  else:
427  assert fibonacci_to_index(n) == None, (n, fibonacci_to_index(n))
428  for n in range(-2**32 - 32768, -2**32 + 32768):
429  if fibonacci_is(n):
430  assert -46 <= fibonacci_to_index(n) <= 47, (n, fibonacci_to_index(n))
431  else:
432  assert fibonacci_to_index(n) == None, (n, fibonacci_to_index(n))
433  for n in range(2**32 - 32768, 2**32 + 32768):
434  if fibonacci_is(n):
435  assert 0 <= fibonacci_to_index(n) <= 47, (n, fibonacci_to_index(n))
436  else:
437  assert fibonacci_to_index(n) == None, (n, fibonacci_to_index(n))
438  else:
439  print(debug.assertspeed_str(), end='')
440  print('ok'); sys.stdout.flush()
441 
442 
443  print('fibonacci_to_index()...', end=''); sys.stdout.flush()
444  assert fibonacci_to_index(-5) == None, fibonacci_to_index(-5)
445  assert fibonacci_to_index(-4) == None, fibonacci_to_index(-4)
446  assert fibonacci_to_index(-3) == -4, fibonacci_to_index(-3)
447  assert fibonacci_to_index(-2) == None, fibonacci_to_index(-2)
448  assert fibonacci_to_index(-1) == -2, fibonacci_to_index(-1)
449  assert fibonacci_to_index(0) == 0, fibonacci_to_index(0)
450  assert fibonacci_to_index(1) == 1, fibonacci_to_index(1)
451  assert fibonacci_to_index(2) == 3, fibonacci_to_index(2)
452  assert fibonacci_to_index(3) == 4, fibonacci_to_index(3)
453  assert fibonacci_to_index(4) == None, fibonacci_to_index(4)
454  for k in range(-1000, 0):
455  assert fibonacci_to_index(fibonacci(k)) == (-1)**(k&1) * k, \
457  for k in range(3, 1000):
458  assert fibonacci_to_index(fibonacci(k)) == k, \
460  for n in range(-16384, 16384):
461  k = fibonacci_to_index(n)
462  if k != None:
463  assert fibonacci(k) == n, (n, k, fibonacci(k))
464  if debug.assertspeed >= debug.ASSERT_NORMAL:
465  for n in range(-(2**45), 2**45, 1000000000):
466  k = fibonacci_to_index(n)
467  if k != None:
468  assert fibonacci(k) == n, (n, k, fibonacci(k))
469  for n in range(-2**32 - 32768, -2**32 + 32768):
470  k = fibonacci_to_index(n)
471  if k != None:
472  assert fibonacci(k) == n, (n, k, fibonacci(k))
473  for n in range(2**32 - 32768, 2**32 + 32768):
474  k = fibonacci_to_index(n)
475  if k != None:
476  assert fibonacci(k) == n, (n, k, fibonacci(k))
477  else:
478  print(debug.assertspeed_str(), end='')
479  print('ok'); sys.stdout.flush()
480 
481 
482  print('fibonacci_gen()...', end=''); sys.stdout.flush()
483  for k in range(-100, 1000):
484  Fk_1, Fk = fibonacci2(k)
485  assert fibonacci_gen(0, 1, k) == Fk, (k, fibonacci_gen(0, 1, k), Fk)
486  assert fibonacci_gen(2, 1, k) == Fk_1*2 + Fk, (k, fibonacci_gen(2, 1, k), Fk_1*2 + Fk)
487  for a in range(-10, 10):
488  assert fibonacci_gen(0, a, k) == Fk*a, (k, fibonacci_gen(0, a, k), Fk*a)
489  assert fibonacci_gen(a, 0, k) == Fk_1*a, (k, fibonacci_gen(a, 0, k), Fk_1*a)
490  assert fibonacci_gen(a, a, k) == (Fk + Fk_1)*a, \
491  (k, fibonacci_gen(a, a, k), (Fk + Fk_1)*a)
492  assert fibonacci_gen(-a, a, k) == (Fk - Fk_1)*a, \
493  (k, fibonacci_gen(-a, a, k), (Fk - Fk_1)*a)
494  print('ok'); sys.stdout.flush()
495 
496 
497  print('fibonacci2_gen()...', end=''); sys.stdout.flush()
498  for k in range(-500, 3000):
499  assert fibonacci2_gen(0, 1, k) == fibonacci2(k), \
500  (k, fibonacci2_gen(0, 1, k), fibonacci2(k))
501  assert fibonacci2_gen(2, 1, k) == lucas2(k), \
502  (k, fibonacci2_gen(2, 1, k), lucas2(k))
503  print('ok'); sys.stdout.flush()
504 
505 
506  print('lucas()...', end=''); sys.stdout.flush()
507  Lk_1 = -1
508  Lk = 2
509  for k in range(5000):
510  assert lucas(k) == Lk, (k, lucas(k))
511  Lk_1, Lk = Lk, Lk + Lk_1
512  Lk_1 = -1
513  Lk = 2
514  for k in range(0, -1000, -1):
515  assert lucas(k) == Lk, (k, lucas(k))
516  Lk_1, Lk = Lk - Lk_1, Lk_1
517  print('ok'); sys.stdout.flush()
518 
519  print('lucas2()...', end=''); sys.stdout.flush()
520  assert lucas2(0) == (-1, 2), lucas2(0)
521  assert lucas2(1) == (2, 1), lucas2(1)
522  assert lucas2(2) == (1, 3), lucas2(2)
523  assert lucas2(3) == (3, 4), lucas2(3)
524  Lk_1 = -1
525  Lk = 2
526  for k in range(5000):
527  assert lucas2(k) == (Lk_1, Lk), (k, lucas2(k))
528  Lk_1, Lk = Lk, Lk + Lk_1
529  Lk_1 = -1
530  Lk = 2
531  for k in range(0, -1000, -1):
532  assert lucas(k) == Lk, (k, lucas(k))
533  Lk_1, Lk = Lk - Lk_1, Lk_1
534  print('ok'); sys.stdout.flush()
535 
536 
537  print('lucas_is()...', end=''); sys.stdout.flush()
538  assert not lucas_is(-5)
539  assert lucas_is(-4)
540  assert not lucas_is(-3)
541  assert not lucas_is(-2)
542  assert lucas_is(-1)
543  assert not lucas_is(0)
544  assert lucas_is(1)
545  assert lucas_is(2)
546  assert lucas_is(3)
547  assert lucas_is(4)
548  assert not lucas_is(5)
549  for k in range(-1000, 1000):
550  assert lucas_is(lucas(k)), (k, lucas(k))
551  for n in range(-16384, 16384):
552  if lucas_is(n):
553  assert -45 <= lucas_to_index(n) <= 46, (n, lucas_to_index(n))
554  else:
555  assert lucas_to_index(n) == None, (n, lucas_to_index(n))
556  if debug.assertspeed >= debug.ASSERT_NORMAL:
557  for n in range(-(2**45), 2**45, 10000000000):
558  if lucas_is(n):
559  assert -45 <= lucas_to_index(n) <= 46, (n, lucas_to_index(n))
560  else:
561  assert lucas_to_index(n) == None, (n, lucas_to_index(n))
562  for n in range(-2**32 - 32768, -2**32 + 32768):
563  if lucas_is(n):
564  assert -45 <= lucas_to_index(n) <= 46, (n, lucas_to_index(n))
565  else:
566  assert lucas_to_index(n) == None, (n, lucas_to_index(n))
567  for n in range(2**32 - 32768, 2**32 + 32768):
568  if lucas_is(n):
569  assert 0 <= lucas_to_index(n) <= 46, (n, lucas_to_index(n))
570  else:
571  assert lucas_to_index(n) == None, (n, lucas_to_index(n))
572  else:
573  print(debug.assertspeed_str(), end='')
574  print('ok'); sys.stdout.flush()
575 
576 
577  print('lucas_to_index()...', end=''); sys.stdout.flush()
578  assert lucas_to_index(-5) == None, lucas_to_index(-5)
579  assert lucas_to_index(-4) == -3, lucas_to_index(-4)
580  assert lucas_to_index(-3) == None, lucas_to_index(-3)
581  assert lucas_to_index(-2) == None, lucas_to_index(-2)
582  assert lucas_to_index(-1) == -1, lucas_to_index(-1)
583  assert not lucas_to_index(0) == 0, lucas_to_index(0)
584  assert lucas_to_index(1) == 1, lucas_to_index(1)
585  assert lucas_to_index(2) == 0, lucas_to_index(2)
586  assert lucas_to_index(3) == 2, lucas_to_index(3)
587  assert lucas_to_index(4) == 3, lucas_to_index(4)
588  assert lucas_to_index(5) == None, lucas_to_index(5)
589  for k in range(-1000, 0):
590  assert lucas_to_index(lucas(k)) == -(-1)**(k&1) * k, (k, lucas_to_index(lucas(k)))
591  for k in range(3, 1000):
592  assert lucas_to_index(lucas(k)) == k, (k, lucas_to_index(lucas(k)))
593  for n in range(-16384, 16384):
594  k = lucas_to_index(n)
595  if k != None:
596  assert lucas(k) == n, (n, k, lucas(k))
597  if debug.assertspeed >= debug.ASSERT_NORMAL:
598  for n in range(-(2**45), 2**45, 1000000000):
599  k = lucas_to_index(n)
600  if k != None:
601  assert lucas(k) == n, (n, k, lucas(k))
602  for n in range(-2**32 - 32768, -2**32 + 32768):
603  k = lucas_to_index(n)
604  if k != None:
605  assert lucas(k) == n, (n, k, lucas(k))
606  for n in range(2**32 - 32768, 2**32 + 32768):
607  k = lucas_to_index(n)
608  if k != None:
609  assert lucas(k) == n, (n, k, lucas(k))
610  else:
611  print(debug.assertspeed_str(), end='')
612  print('ok'); sys.stdout.flush()
613 
614 
615  print('prod()...', end=''); sys.stdout.flush()
616  for n in range(100):
617  f = lambda n: n
618  assert prod(f, range(1, n + 1)) == math.factorial(n), \
619  (n, prod(f, range(1, n + 1)), math.factorial(n))
620  assert prod(f, range(-n, n + 1)) == 0, (n, prod(f, range(-n, n + 1)))
621 
622  assert prod(f, range(1, 2*n, 2)) == natseq.prod(range(1, 2*n, 2)), \
623  (n, prod(f, range(1, 2*n, 2)), natseq.prod(range(1, 2*n, 2)))
624 
625  f = lambda n: n * n
626  assert prod(f, range(1, n + 1)) == math.factorial(n)**2, \
627  (n, prod(f, range(1, n + 1)), math.factorial(n)**2)
628  assert prod(f, range(-n, n + 1)) == 0, (n, prod(f, range(-n, n + 1)))
629 
630  assert prod(f, range(1, 2*n, 2)) == natseq.prod(range(1, 2*n, 2))**2, \
631  (n, prod(f, range(1, 2*n, 2)), natseq.prod(range(1, 2*n, 2))**2)
632  print('ok'); sys.stdout.flush()
633 
634 
635  print('sum()...', end=''); sys.stdout.flush()
636  for n in range(100):
637  f = lambda n: n
638  assert sum(f, range(n + 1)) == n*(n + 1)//2, (n, sum(f, range(n + 1)), n*(n + 1)//2)
639  assert sum(f, range(-n, n + 1)) == 0, (n, sum(f, range(-n, n + 1)))
640 
641  assert sum(f, range(1, 2*n, 2)) == n*n, (n, sum(f, range(1, 2*n, 2)), n*n)
642 
643  f = lambda n: n * n
644  assert sum(f, range(n + 1)) == n*(n + 1)*(2*n + 1)//6, \
645  (n, sum(f, range(n + 1)), n*(n + 1)*(2*n + 1)//6)
646  assert sum(f, range(-n, n + 1)) == n*(n + 1)*(2*n + 1)//3, \
647  (n, sum(f, range(-n, n + 1)), n*(n + 1)*(2*n + 1)//3)
648 
649  assert sum(f, range(1, 2*n, 2)) == n*(4*n*n - 1)//3, \
650  (n, sum(f, range(1, 2*n, 2)), n*(4*n*n - 1)//3)
651  print('ok'); sys.stdout.flush()
652  debug.test_end()
653 
654  main_test()
655 ##\endcond MAINTEST