12 from __future__
import print_function
15 VERSION =
'factors --- 2010 April 12'
17 import bisect, fractions, types
32 """Pour s = [... (P_i, e_i) ...] où P_i est le ième nombre premier
33 renvoie Sum_i e_i * 2**(i - 1)
34 [OEIS A048675] (Binary Encoding of Factorizations)
36 Pre: s: séquence strictement ordonnée de primaries
45 i = bisect.bisect_left(nat32.PRIME_16_ARRAY, p[0])
46 if i >= len(nat32.PRIME_16_ARRAY):
47 raise NotImplementedError
54 """Renvoie True si s et t sont premiers entre eux,
57 Pre: s: séquence strictement ordonnée de primaries
58 t: séquence strictement ordonnée de primaries
66 return gcd(s, t) == []
76 """Renvoie la distance de Dominici entre les naturels
77 ayant s et t pour liste de leurs primaries
79 Pre: s: séquence strictement ordonnée de primaries
80 t: séquence strictement ordonnée de primaries
97 """Renvoie le nombre des diviseurs du naturel
98 ayant s pour liste des primaries
99 == divisors_sum_pow(s, 0)
101 Pre: s: séquence strictement ordonnée de primaries
116 """Renvoie le produit des diviseurs du naturel
117 ayant s pour liste des primaries
119 Pre: s: séquence strictement ordonnée de primaries
130 assert i[1]%2 == 0, (i, s)
140 """Renvoie la somme des diviseurs du naturel
141 ayant s pour liste des primaries
142 == divisors_sum_pow(s, 1)
144 Pre: s: séquence strictement ordonnée de primaries
152 return (n
if (len(s) == 0)
or (s[0][0] != 2)
153 else n * natural.mersenne(s[0][1] + 1))
158 """Renvoie la somme des diviseurs pairs du naturel
159 ayant s pour liste des primaries
161 Pre: s: séquence strictement ordonnée de primaries
168 if (len(s) == 0)
or (s[0][0] != 2):
173 n *= (i[0]**(i[1] + 1) - 1) // (i[0] - 1)
174 return (n * natural.mersenne(s[0][1])) << 1
179 """Renvoie la somme des diviseurs pairs du naturel
180 ayant s pour liste des primaries
182 Pre: s: séquence strictement ordonnée de primaries
190 if (len(s) == 0)
or (s[0][0] != 2):
192 n *= (i[0]**(i[1] + 1) - 1) // (i[0] - 1)
195 n *= (i[0]**(i[1] + 1) - 1) // (i[0] - 1)
201 """Renvoie la somme des diviseurs ** k du naturel
202 ayant s pour liste des primaries
204 Pre: s: séquence strictement ordonnée de primaries
216 n *= (i[0]**(k*(i[1] + 1)) - 1) // (i[0]**k - 1)
231 """Pour n = Sum_(i=0)^infini b_i * 2**i
232 renvoie les primaries de Prod_(i=1)^infini P_i**(b_(i-1))
233 où P_i est le ième nombre premier
235 bef(feb_primaries(n)) == n
239 Result: séquence strictement ordonnée de primaries (naturel premier, 1)
246 while (n > 0)
and (i < len(nat32.PRIME_16_ARRAY)):
248 s.append((nat32.PRIME_16_ARRAY[i], 1))
252 raise NotImplementedError
258 """Renvoie le PGCD de s et t
259 (Plus Grand Commun Diviseur/ Greatest Common Divisor)
261 Pre: s: séquence strictement ordonnée de primaries
262 t: séquence strictement ordonnée de primaries
264 Result: séquence strictement ordonnée de primaries
270 if (len(s) > 0)
and (len(t) > 0):
274 while (len(s) > s_i)
and (len(t) > t_i):
275 while s[s_i][0] < t[t_i][0]:
279 while s[s_i][0] > t[t_i][0]:
283 if s[s_i][0] != t[t_i][0]:
285 l.append((s[s_i][0], min(s[s_i][1], t[t_i][1])))
299 """Renvoie le "nombre de Gödel" de la séquence s
300 Pour s == (a_1, a_2, a_3, ..., a_k), renvoie prod_i=1^k (P_i)^(a_i)
301 où P_i est le ième nombre premier
303 Pre: s: séquence de naturels
308 assert isinstance(s, list)
or isinstance(s, tuple), type(s)
311 if len(s) > len(nat32.PRIME_16_ARRAY):
312 raise NotImplementedError
313 for i
in range(len(s)):
316 n *= nat32.PRIME_16_ARRAY[i]**s[i]
326 """Pour n == prod_i=1^k (P_i)^(a_i) renvoie [a_1, a_2, a_3, ..., a_k]
327 Si n == 1 alors renvoie []
331 Result: [] ou list de naturels dont le dernier élément est != 0
339 l = [natural.scan1(n)]
341 for p
in nat32.PRIME_16_ARRAY[1:]:
353 raise NotImplementedError
358 """Renvoie PPCM de s et t
359 (Plus Petit Commun Multiple/ Least Common Multiple)
361 Pre: s: séquence strictement ordonnée de primaries
362 t: séquence strictement ordonnée de primaries
364 Result: séquence strictement ordonnée de primaries
370 if (len(s) > 0)
and (len(t) > 0):
374 while (len(s) > s_i)
and (len(t) > t_i):
375 if s[s_i][0] < t[t_i][0]:
376 l.append((s[s_i][0], s[s_i][1]))
378 elif s[s_i][0] > t[t_i][0]:
379 l.append((t[t_i][0], t[t_i][1]))
382 l.append((s[s_i][0], max(s[s_i][1], t[t_i][1])))
387 return (l + t[t_i:]
if len(t) > t_i
397 """Renvoie la fonction de Möbius du naturel
398 ayant s pour liste des primaries
400 Pre: s: séquence strictement ordonnée de primaries
412 return (1
if k&1 == 0
418 """Renvoie le produit s et t
420 Pre: s: séquence strictement ordonnée de primaries
421 t: séquence strictement ordonnée de primaries
423 Result: séquence strictement ordonnée de primaries
429 if (len(s) > 0)
and (len(t) > 0):
433 while (len(s) > s_i)
and (len(t) > t_i):
434 while s[s_i][0] < t[t_i][0]:
435 l.append((s[s_i][0], s[s_i][1]))
439 while s[s_i][0] > t[t_i][0]:
440 l.append((t[t_i][0], t[t_i][1]))
444 if s[s_i][0] == t[t_i][0]:
445 l.append((s[s_i][0], s[s_i][1] + t[t_i][1]))
450 return (l + t[t_i:]
if len(t) > t_i
461 """Renvoie le nombre de décompositions (en tenant compte de l'ordre)
462 en somme de 4 carrés d'entiers du naturel
463 ayant s pour liste des primaries
465 Pre: s: séquence strictement ordonnée de primaries
467 Result: naturel multiple de 8
478 """Renvoie le produit des facteurs non communs de s et t
479 (Not common Factors Product)
481 Pre: s: séquence strictement ordonnée de primaries
482 t: séquence strictement ordonnée de primaries
484 Result: séquence strictement ordonnée de primaries
490 if (len(s) > 0)
and (len(t) > 0):
494 while (len(s) > s_i)
and (len(t) > t_i):
495 while s[s_i][0] < t[t_i][0]:
496 l.append((s[s_i][0], s[s_i][1]))
500 while s[s_i][0] > t[t_i][0]:
501 l.append((t[t_i][0], t[t_i][1]))
505 if s[s_i][0] == t[t_i][0]:
506 if s[s_i][1] > t[t_i][1]:
507 l.append((s[s_i][0], s[s_i][1] - t[t_i][1]))
508 elif s[s_i][1] < t[t_i][1]:
509 l.append((s[s_i][0], t[t_i][1] - s[s_i][1]))
514 return (l + t[t_i:]
if len(t) > t_i
524 """Renvoie le nombre de nontotatives du naturel
525 ayant s pour liste des primaries
526 (Si s == [] alors renvoie 0)
528 Pre: s: séquence strictement ordonnée de primaries
556 Pre: s: séquence strictement ordonnée de primaries
557 t: séquence strictement ordonnée de primaries
558 f: fonction : (naturel >= 1, naturel >= 1) -> naturel
560 Result: séquence strictement ordonnée de primaries
565 assert isinstance(f, types.FunctionType), type(f)
570 while (len(s) > s_i)
and (len(t) > t_i):
571 if s[s_i][0] == t[t_i][0]:
572 gamma = f(s[s_i][1], t[t_i][1])
574 l.append((s[s_i][0], gamma))
577 elif s[s_i][0] > t[t_i][0]:
578 gamma = f(0, t[t_i][1])
580 l.append((t[t_i][0], gamma))
583 gamma = f(s[s_i][1], 0)
585 l.append((s[s_i][0], gamma))
588 gamma = f(s[s_i][1], 0)
590 l.append((s[s_i][0], gamma))
593 gamma = f(0, t[t_i][1])
595 l.append((t[t_i][0], gamma))
613 """Renvoie la liste des primaries (dans l'ordre strictement croissant) de n
614 c.-à-d. les couples (facteur premier, exposant) décomposant n
615 (Si n == 1 alors renvoie []).
616 Le nombre de primaries (la longueur de la liste renvoyée) correspond
617 au nombre de facteurs premiers distincts de n
622 Result: séquence strictement ordonnée (sur le premier élément) de couples
623 (naturel premier, naturel >= 1)
630 nb = natural.scan1(n)
638 for i
in range(1, len(nat32.PRIME_16_ARRAY)):
640 d = nat32.PRIME_16_ARRAY[i]
651 assert d%nat32.PRIMORIAL32_TUPLE[4] == 1, \
652 (d, nat32.PRIMORIAL32_TUPLE[4], d%nat32.PRIMORIAL32_TUPLE[4])
656 for m
in nat32.MODS_PRIMORIAL_4_DIFF_TUPLE:
673 """Renvoie True si p est une séquence strictement ordonnée de primaries,
679 if isinstance(s, list)
or isinstance(s, tuple):
683 if ((
not isinstance(i, tuple))
or (len(i) != 2)
685 or (i[1] == 0)
or (prev_n >= i[0])
or (
not natural.prime_is(i[0]))):
696 """Renvoie True si s représente un nombre premier, False sinon
698 Pre: s: séquence strictement ordonnée de primaries
703 return (len(s) == 1)
and (s[0][1] == 1)
708 """Renvoie un string représentant les primaries
709 (Si s est vide alors renvoie '1')
711 Pre: s: séquence strictement ordonnée de primaries
712 times: string représentant l'opérateur de multiplication
713 exp: string représentant l'opérateur d'exponentiation
723 l.append(
'{0}{1}{2}'.format(i[0], exp, i[1])
if i[1] > 1
732 """Renvoie le naturel ayant s pour liste des primaries
733 (Si s est vide alors renvoie 1)
735 Pre: s: séquence strictement ordonnée de primaries
750 """Renvoie la liste des primes à partir de la liste des primaries
751 (Si s est vide alors renvoie [])
753 Pre: s: séquence strictement ordonnée de primaries
755 Result: séquence ordonnée de primes
768 """Renvoie la liste des primes (dans l'ordre croissant) de n
769 c.-à-d. les facteurs premiers de n
770 (Si n == 1 alors renvoie []).
771 Le nombre de primes (la longueur de la liste renvoyée) correspond
772 au nombre de facteurs premiers (non nécessairement distincts) de n
777 Result: séquence ordonnée de naturels premiers
784 nb = natural.scan1(n)
789 for i
in range(1, len(nat32.PRIME_16_ARRAY)):
791 d = nat32.PRIME_16_ARRAY[i]
802 assert d%nat32.PRIMORIAL32_TUPLE[4] == 1, \
803 (d, nat32.PRIMORIAL32_TUPLE[4], d%nat32.PRIMORIAL32_TUPLE[4])
807 for m
in nat32.MODS_PRIMORIAL_4_DIFF_TUPLE:
824 """Renvoie True si p est une séquence ordonnée de primes,
830 if isinstance(s, list)
or isinstance(s, tuple):
843 """Renvoie un string représentant les primes
844 (Si s est vide alors renvoie '1')
846 Pre: s: séquence ordonnée de primes
847 times: string représentant l'opérateur de multiplication
865 """Renvoie le naturel ayant s pour liste des primes
866 (Si s est vide alors renvoie 1)
868 Pre: s: séquence ordonnée de primes
883 """Renvoie la liste des primaries à partir de la liste des primes
884 (Si s est vide alors renvoie [])
886 Pre: s: séquence ordonnée de primes
888 Result: séquence strictement ordonnée de primaries
913 """Renvoie la somme des diviseurs propres du naturel
914 ayant s pour liste des primaries
915 == divisors_sum(s) - primaries_to_n(s)
917 Pre: s: séquence strictement ordonnée de primaries
929 n *= (t*i[0] - 1) // (i[0] - 1)
935 """Pour s = [... (P_i, e_i) ...] où P_i est le ième nombre premier
936 renvoie [... (P_i, 1) ...]
937 Renvoie le produit des facteurs premiers distincts
938 du naturel ayant s pour liste des primaries
939 [OEIS A007947] Largest square-free number dividing n (the square-free kernel of n)
941 Pre: s: séquence strictement ordonnée de primaries
943 Result: séquence strictement ordonnée de primaries (naturel premier, 1)
956 """Renvoie True si p représente un nombre sans carré [OEIS A005117],
959 Pre: s: séquence strictement ordonnée de primaries
972 """Renvoie le nombre de totatives du naturel
973 ayant s pour liste des primaries
974 (Si s == [] alors renvoie 1)
976 Pre: s: séquence strictement ordonnée de primaries
985 nb *= (i[0] - 1) * i[0]**(i[1] - 1)
993 if __name__ ==
'__main__':
999 if not 'profile' in dir():
1009 debug.test_begin(VERSION, __debug__)
1011 print(
'bef()...', end=
''); sys.stdout.flush()
1012 assert bef([]) == 0,
bef([])
1013 assert bef([(2, 1)]) == 1,
bef([(2, 1)])
1014 assert bef([(2, 3)]) == 3,
bef([(2, 3)])
1015 assert bef([(5, 1)]) == 4,
bef([(5, 1)])
1016 assert bef([(5, 3)]) == 12,
bef([(5, 3)])
1017 assert bef([(2, 10), (5, 3)]) == 22,
bef([(2, 10), (5, 3)])
1018 assert bef([(2, 10), (5, 3), (11, 2)]) == 54,
bef([(2, 10), (5, 3), (11, 2)])
1019 for i
in range(100):
1020 assert bef([(nat32.PRIME_16_ARRAY[i], 1)]) == 2**i, \
1021 (i, nat32.PRIME_16_ARRAY[i],
bef([(nat32.PRIME_16_ARRAY[i], 1)]), 2**i)
1022 print(
'ok'); sys.stdout.flush()
1025 print(
'coprime_is()...', end=
''); sys.stdout.flush()
1027 for m
in range(1, 50
if debug.assertspeed >= debug.ASSERT_NORMAL
else 30):
1030 for p
in nat32.PRIME_16_ARRAY[:1000
if debug.assertspeed >= debug.ASSERT_NORMAL
else
1037 for m
in range(1, 50
if debug.assertspeed >= debug.ASSERT_NORMAL
else 30):
1039 for n
in range(1, 10):
1043 if debug.assertspeed >= debug.ASSERT_NORMAL:
1044 for m
in range(2**32 - 1, 2**32 + 1):
1047 print(debug.assertspeed_str(), end=
'')
1048 print(
'ok'); sys.stdout.flush()
1051 print(
'distance_dominici()...', end=
''); sys.stdout.flush()
1055 for a
in range(1, 100):
1058 for b
in range(1, 50):
1062 print(
'???', end=
'')
1063 print(
'ok'); sys.stdout.flush()
1066 print(
'divisors_nb()...', end=
''); sys.stdout.flush()
1073 for n
in range(1, 1000):
1075 d = natural.divisors(n)
1077 print(
'ok'); sys.stdout.flush()
1080 print(
'divisors_prod()...', end=
''); sys.stdout.flush()
1085 assert divisors_prod([(2, 5), (3, 2)]) == 13631146639813244878848, \
1088 for n
in range(1, 1000):
1090 d = natural.divisors(n)
1092 print(
'ok'); sys.stdout.flush()
1095 print(
'divisors_sum()...', end=
''); sys.stdout.flush()
1102 for n
in range(1, 1000):
1104 d = natural.divisors(n)
1106 print(
'ok'); sys.stdout.flush()
1109 print(
'divisors_sum_odd()...', end=
''); sys.stdout.flush()
1116 for n
in range(1, 1000):
1118 d = natural.divisors_cond(n,
lambda d: d&1 != 0)
1121 print(
'ok'); sys.stdout.flush()
1124 print(
'divisors_sum_even()...', end=
''); sys.stdout.flush()
1131 for n
in range(1, 1000):
1133 d = natural.divisors_cond(n,
lambda d: d&1 == 0)
1138 print(
'ok'); sys.stdout.flush()
1141 print(
'divisors_sum_pow()...', end=
''); sys.stdout.flush()
1161 for n
in range(1, 1000):
1163 d = natural.divisors(n)
1171 print(
'ok'); sys.stdout.flush()
1174 print(
'feb_primaries()...', end=
''); sys.stdout.flush()
1183 for i
in range(100):
1185 for j
in range(100):
1188 [(nat32.PRIME_16_ARRAY[min(i, j)], 1),
1189 (nat32.PRIME_16_ARRAY[max(i, j)], 1)], \
1191 for n
in range(1000):
1193 assert nat32.prime_is(p[0]), (n, p)
1194 assert p[1] == 1, (n, p)
1196 print(
'ok'); sys.stdout.flush()
1199 print(
'gcd()...', end=
''); sys.stdout.flush()
1200 assert gcd([], []) == [],
gcd([], [])
1201 for m
in range(1, 1000
if debug.assertspeed >= debug.ASSERT_NORMAL
else 100):
1203 assert gcd(f, []) == [], (m,
gcd(f, []), f)
1204 assert gcd([], f) == [], (m,
gcd([], f), f)
1205 assert gcd(f, f) == f, (m,
gcd(f, f), f)
1206 for p
in nat32.PRIME_16_ARRAY[:200]:
1208 assert gcd(f, [(p, 1)]) == [(p, 1)], (m, p,
gcd(f, [(p, 1)]), f)
1210 assert gcd(f, [(p, 1)]) == [], (m, p,
gcd(f, [(p, 1)]), f)
1211 for m
in range(1, 100):
1213 for n
in range(1, 100):
1216 assert gcd(m_f, n_f) == d_f, (m, n,
gcd(m_f, n_f),
1217 m_f, n_f, fractions.gcd(m, n), d_f)
1218 assert gcd(n_f, m_f) == d_f, (m, n,
gcd(n_f, m_f),
1219 m_f, n_f, fractions.gcd(m, n), d_f)
1220 if debug.assertspeed < debug.ASSERT_NORMAL:
1221 print(debug.assertspeed_str(), end=
'')
1222 print(
'ok'); sys.stdout.flush()
1225 print(
'godelnumber()...', end=
''); sys.stdout.flush()
1238 p *= nat32.PRIME_16_ARRAY[n]
1240 assert godelnumber((0, )*n + (a, )) == nat32.PRIME_16_ARRAY[n]**a, \
1242 nat32.PRIME_16_ARRAY[n]**a, (0, )*n + (a, ))
1243 print(
'ok'); sys.stdout.flush()
1246 print(
'godelnumber_to_list()...', end=
''); sys.stdout.flush()
1252 for n
in range(1, 1000):
1257 print(
'ok'); sys.stdout.flush()
1260 print(
'lcm()...', end=
''); sys.stdout.flush()
1261 assert lcm([], []) == [],
lcm([], [])
1262 for m
in range(1, 1000
if debug.assertspeed >= debug.ASSERT_NORMAL
else 100):
1264 assert lcm(f, []) == f, (m,
lcm(f, []), f)
1265 assert lcm([], f) == f, (m,
lcm([], f), f)
1266 assert lcm(f, f) == f, (m,
lcm(f, f), f)
1267 for p
in nat32.PRIME_16_ARRAY[:30]:
1269 assert lcm(f, [(p, 1)]) == f, (m, p,
lcm(f, [(p, 1)]), f)
1271 assert lcm(f, [(p, 1)]) ==
primaries(m * p), (m, p,
lcm(f, [(p, 1)]), f)
1272 for m
in range(1, 100):
1274 for n
in range(1, 100):
1277 assert lcm(m_f, n_f) == d_f, (m, n,
lcm(m_f, n_f), m_f, n_f, nat32.lcm(m, n), d_f)
1278 assert lcm(n_f, m_f) == d_f, (m, n,
lcm(n_f, m_f), m_f, n_f, nat32.lcm(m, n), d_f)
1279 if debug.assertspeed < debug.ASSERT_NORMAL:
1280 print(debug.assertspeed_str(), end=
'')
1281 print(
'ok'); sys.stdout.flush()
1284 print(
'mobius()...', end=
''); sys.stdout.flush()
1290 assert mobius([(2, 1), (5, 1)]) == 1,
mobius([(2, 1), (5, 1)])
1291 for p
in nat32.PRIME_16_ARRAY[2:]:
1294 assert mobius([(2, 1), (p, 1)]) == 1, (p,
mobius([(2, 1), (p, 1)]))
1295 assert mobius([(2, 1), (3, 1), (p, 1)]) == -1, (p,
mobius([(2, 1), (3, 1), (p, 1)]))
1296 print(
'ok'); sys.stdout.flush()
1299 print(
'mul()...', end=
''); sys.stdout.flush()
1300 assert mul([], []) == [],
mul([], [])
1301 for n
in range(1, 1000):
1303 assert mul(f, []) == f, (m,
mul(f, []), f)
1304 assert mul([], f) == f, (m,
mul([], f), f)
1306 for m
in range(1, 100):
1308 for n
in range(1, 100):
1311 assert mul(m_f, n_f) == d_f, (m, n,
mul(m_f, n_f), m_f, n_f, m*n, d_f)
1312 assert mul(n_f, m_f) == d_f, (m, n,
mul(n_f, m_f), m_f, n_f, m*n, d_f)
1313 print(
'ok'); sys.stdout.flush()
1316 print(
'nb_in_integers_4sqr()...', end=
''); sys.stdout.flush()
1322 for n
in range(1, 1000):
1330 print(
'ok'); sys.stdout.flush()
1333 print(
'nfp()...', end=
''); sys.stdout.flush()
1334 assert nfp([], []) == [],
nfp([], [])
1335 for n
in range(1, 1000
if debug.assertspeed >= debug.ASSERT_NORMAL
else 100):
1337 assert nfp(f, []) == f, (m,
nfp(f, []), f)
1338 assert nfp([], f) == f, (m,
nfp([], f), f)
1339 assert nfp(f, f) == [], (m,
nfp(f, f), f)
1340 for p
in nat32.PRIME_16_ARRAY[:50]:
1342 assert nfp(f, [(p, 1)]) ==
primaries(m//p), (m, p,
nfp(f, [(p, 1)]), f)
1344 assert nfp(f, [(p, 1)]) ==
primaries(m*p), (m, p,
nfp(f, [(p, 1)]), f)
1345 for m
in range(1, 100):
1347 for n
in range(1, 100):
1350 assert nfp(m_f, n_f) == d_f, (m, n,
nfp(m_f, n_f), m_f, n_f, nat32.nfp(m, n), d_f)
1351 assert nfp(n_f, m_f) == d_f, (m, n,
nfp(n_f, m_f), m_f, n_f, nat32.nfp(m, n), d_f)
1352 if debug.assertspeed < debug.ASSERT_NORMAL:
1353 print(debug.assertspeed_str(), end=
'')
1354 print(
'ok'); sys.stdout.flush()
1357 print(
'nontotient()...', end=
''); sys.stdout.flush()
1365 for n
in range(1, 500
if debug.assertspeed >= debug.ASSERT_NORMAL
else 100):
1368 natural.nontotatives(n))
1369 for p
in nat32.PRIME_16_ARRAY:
1371 if debug.assertspeed < debug.ASSERT_NORMAL:
1372 print(debug.assertspeed_str(), end=
'')
1373 print(
'ok'); sys.stdout.flush()
1376 print(
'ope_exp()...', end=
''); sys.stdout.flush()
1377 assert ope_exp([], [],
lambda a, b: a + b) == [],
ope_exp([], [],
lambda a, b: a + b)
1378 for m
in range(1, 200):
1380 for n
in range(1, 200
if debug.assertspeed >= debug.ASSERT_NORMAL
else 20):
1382 r =
ope_exp(m_f, n_f,
lambda a, b: a + b)
1383 assert r ==
mul(m_f, n_f), (m, n, r,
mul(m_f, n_f))
1385 r =
ope_exp(m_f, n_f,
lambda a, b: a - b)
1387 r =
ope_exp(m_f, n_f,
lambda a, b: min(a, b))
1388 assert r ==
gcd(m_f, n_f), (m, n, r,
gcd(m_f, n_f))
1389 r =
ope_exp(m_f, n_f,
lambda a, b: max(a, b))
1390 assert r ==
lcm(m_f, n_f), (m, n, r,
lcm(m_f, n_f))
1391 r =
ope_exp(m_f, n_f,
lambda a, b: abs(a - b))
1392 assert r ==
nfp(m_f, n_f), (m, n, r,
nfp(m_f, n_f))
1393 if debug.assertspeed < debug.ASSERT_NORMAL:
1394 print(debug.assertspeed_str(), end=
'')
1395 print(
'ok'); sys.stdout.flush()
1398 print(
'primaries()...', end=
''); sys.stdout.flush()
1406 q = nat32.PRIME_16_ARRAY[100]
1407 for p
in nat32.PRIME_16_ARRAY[:100]:
1408 for k
in range(1, 10):
1410 assert primaries(p**k * q**(k + 1)) == [(p, k), (q, k + 1)], \
1413 for n
in range(1, 1000):
1416 assert nat32.prime_is(p[0]), (n, p)
1418 assert p[1] >= 1, (n, p[1])
1419 print(
'ok'); sys.stdout.flush()
1422 print(
'primaries_is()...', end=
''); sys.stdout.flush()
1432 for n
in range(1, 1000):
1434 print(
'ok'); sys.stdout.flush()
1437 print(
'primaries_prime_is()...', end=
''); sys.stdout.flush()
1438 for p
in nat32.PRIME_16_ARRAY[:1000]:
1441 for n
in range(1, 100):
1445 print(
'ok'); sys.stdout.flush()
1448 print(
'primaries_str()...', end=
''); sys.stdout.flush()
1456 assert primaries_str([(3, 2), (5, 7)], times=
' x ', exp=
'**') ==
'3**2 x 5**7', \
1458 print(
'ok'); sys.stdout.flush()
1461 print(
'primaries_to_n()...', end=
''); sys.stdout.flush()
1467 for n
in range(1, 1000):
1470 if debug.assertspeed >= debug.ASSERT_NORMAL:
1471 for n
in range(2**16 - 50, 2**16 + 100):
1474 for n
in range(2**24 - 5, 2**24 + 10):
1478 print(debug.assertspeed_str(), end=
'')
1479 print(
'ok'); sys.stdout.flush()
1482 print(
'primaries_to_primes()...', end=
''); sys.stdout.flush()
1488 for n
in range(1, 1000):
1491 print(
'ok'); sys.stdout.flush()
1494 print(
'primes()...', end=
''); sys.stdout.flush()
1502 q = nat32.PRIME_16_ARRAY[100]
1503 for p
in nat32.PRIME_16_ARRAY[:100]:
1504 for k
in range(1, 10):
1506 assert primes(p**k * q**(k + 1)) == [p]*k + [q]*(k + 1), \
1507 (p, k,
primes(p**k * q**(k + 1)))
1509 for n
in range(1, 1000):
1512 assert nat32.prime_is(p), (n, p)
1518 assert len(f) == nb, (n, len(f), nb)
1519 print(
'ok'); sys.stdout.flush()
1522 print(
'primes_is()...', end=
''); sys.stdout.flush()
1533 for n
in range(1, 1000):
1535 print(
'ok'); sys.stdout.flush()
1538 print(
'primes_str()...', end=
''); sys.stdout.flush()
1548 print(
'ok'); sys.stdout.flush()
1551 print(
'primes_to_n()...', end=
''); sys.stdout.flush()
1557 for n
in range(1, 1000):
1559 if debug.assertspeed >= debug.ASSERT_NORMAL:
1560 for n
in range(2**16 - 50, 2**16 + 100):
1562 for n
in range(2**24 - 5, 2**24 + 10):
1565 print(debug.assertspeed_str(), end=
'')
1566 print(
'ok'); sys.stdout.flush()
1569 print(
'primes_to_primaries()...', end=
''); sys.stdout.flush()
1574 for n
in range(1, 1000):
1577 print(
'ok'); sys.stdout.flush()
1580 print(
'properdivisors_sum()...', end=
''); sys.stdout.flush()
1589 for n
in range(1, 1000):
1591 d = natural.divisors(n)[:-1]
1594 print(
'ok'); sys.stdout.flush()
1597 print(
'rad()...', end=
''); sys.stdout.flush()
1598 assert rad([]) == [],
rad([])
1599 for p
in nat32.PRIME_16_ARRAY[:100]:
1600 for k
in range(1, 10):
1601 assert rad([(p, k)]) == [(p, 1)],
rad([(p, k)])
1602 for n
in range(1, 100):
1606 assert len(f) == len(r), (n, len(f), len(r), f, r)
1608 print(
'ok'); sys.stdout.flush()
1611 print(
'squarefree_is()...', end=
''); sys.stdout.flush()
1620 for n
in range(100):
1622 assert squarefree_is([(nat32.PRIME_16_ARRAY[n], 1)]), (n, nat32.PRIME_16_ARRAY[n])
1623 for k
in range(2, 10):
1625 (n, k, nat32.PRIME_16_ARRAY[n])
1626 print(
'ok'); sys.stdout.flush()
1629 print(
'totient()...', end=
''); sys.stdout.flush()
1637 for n
in range(1, 500
if debug.assertspeed >= debug.ASSERT_NORMAL
else 100):
1640 assert t== len(natural.totatives(n)), \
1641 (n, t, len(natural.totatives(n)), natural.totatives(n), f)
1643 for p
in nat32.PRIME_16_ARRAY:
1644 for k
in range(1, 10):
1645 assert totient([(p, k)]) == (p - 1) * p**(k - 1), (p, k,
totient([(p, k)]))
1646 if debug.assertspeed < debug.ASSERT_NORMAL:
1647 print(debug.assertspeed_str(), end=
'')
1648 print(
'ok'); sys.stdout.flush()