@@ -85,7 +85,7 @@ def combine_fp(pair, pairs_used, fp, path, divide_leading, g):
8585 pairs_used .append (tmp )
8686
8787# Master function, keeps the partial_relations and possible_smooth lists sorted, find the matching large primes, create the full relations from large primes
88- def handle_large_fp (pair , large_primes , pairs_used , fp , graph_fp , size_fp , connected_components_fp , node_component_fp , index_component_fp , g , divide_leading , cycle_len , full_found , partial_found_fp ):
88+ def handle_large_fp (pair , large_primes , pairs_used , fp , graph_fp , size_fp , parent_fp , g , divide_leading , cycle_len , full_found , partial_found_fp ):
8989 pair [4 ] = [large_primes [3 ]]
9090
9191 if large_primes [3 ] == large_primes [4 ]:
@@ -94,98 +94,104 @@ def handle_large_fp(pair, large_primes, pairs_used, fp, graph_fp, size_fp, conne
9494
9595 elif not bool (fp ):
9696 pair [4 ].append (large_primes [4 ])
97- fp [large_primes [3 ]] = {}
98- fp [large_primes [3 ]][large_primes [4 ]] = pair
9997
100- graph_fp [large_primes [3 ]] = [large_primes [4 ]]
101- graph_fp [large_primes [4 ]] = [large_primes [3 ]]
98+ small_p , big_p = large_primes [3 ], large_primes [4 ]
10299
103- connected_components_fp [index_component_fp ] = set ((large_primes [3 ], large_primes [4 ]))
104- node_component_fp [large_primes [3 ]] = index_component_fp
105- node_component_fp [large_primes [4 ]] = index_component_fp
100+ fp [small_p ] = {}
101+ fp [small_p ][big_p ] = pair
102+ 103+ graph_fp [small_p ] = [big_p ]
104+ graph_fp [big_p ] = [small_p ]
105+ 106+ parent_fp [small_p ] = small_p
107+ parent_fp [big_p ] = small_p
106108
107109 size_fp += 1
108- index_component_fp += 1
109110
110111 else :
111- flag_small_prime = large_primes [3 ] in graph_fp
112+ small_p , big_p = large_primes [3 ], large_primes [4 ]
113+ 114+ flag_small_prime = small_p in graph_fp
112115
113116 # If the smallest prime has not already been seen
114117 if not flag_small_prime :
115- graph_fp [large_primes [ 3 ]] = [large_primes [ 4 ] ]
118+ graph_fp [small_p ] = [big_p ]
116119
117120 # Find where in partial relations it is needed to insert the new partial relation
118- pair [4 ].append (large_primes [4 ])
119- fp [large_primes [3 ]] = {}
120- fp [large_primes [3 ]][large_primes [4 ]] = pair
121+ pair [4 ].append (big_p )
122+ 123+ fp [small_p ] = {}
124+ fp [small_p ][big_p ] = pair
121125
122126 size_fp += 1
123127
124128 # Find if largest prime has already been seen
125- flag_big_prime = large_primes [ 4 ] in graph_fp
129+ flag_big_prime = big_p in graph_fp
126130
127131 if flag_big_prime : # if seen add the smallest prime to the list of links of the largest prime
128- graph_fp [large_primes [4 ]].append (large_primes [3 ])
132+ graph_fp [big_p ].append (small_p )
133+ 134+ parent_fp [small_p ] = parent_fp [big_p ]
129135
130- connected_components_fp [node_component_fp [large_primes [4 ]]].add (large_primes [3 ])
131- node_component_fp [large_primes [3 ]] = node_component_fp [large_primes [4 ]]
132136 else : # If it has not been seen, append it
133- graph_fp [large_primes [ 4 ]] = [large_primes [ 3 ] ]
137+ graph_fp [big_p ] = [small_p ]
134138
135- connected_components_fp [index_component_fp ] = set ((large_primes [3 ], large_primes [4 ]))
136- node_component_fp [large_primes [3 ]] = index_component_fp
137- node_component_fp [large_primes [4 ]] = index_component_fp
138- index_component_fp += 1
139+ parent_fp [small_p ] = small_p
140+ parent_fp [big_p ] = small_p
139141
140142 # If the smallest prime has already been seen
141143 else :
142- flag_big_prime = large_primes [ 4 ] in graph_fp
144+ flag_big_prime = big_p in graph_fp
143145
144146 # If big prime has not been seen
145147 if not flag_big_prime :
146- graph_fp [large_primes [3 ]].append (large_primes [4 ]) # Append the largest prime to the list of links of the smallest prime
147- graph_fp [large_primes [4 ]] = [large_primes [3 ]] # Create the large prime in the graph
148- 149- connected_components_fp [node_component_fp [large_primes [3 ]]].add (large_primes [4 ])
150- node_component_fp [large_primes [4 ]] = node_component_fp [large_primes [3 ]]
148+ graph_fp [small_p ].append (big_p ) # Append the largest prime to the list of links of the smallest prime
149+ graph_fp [big_p ] = [small_p ] # Create the large prime in the graph
151150
151+ parent_fp [big_p ] = parent_fp [small_p ]
152152
153- pair [4 ].append (large_primes [ 4 ] )
153+ pair [4 ].append (big_p )
154154 # Find where to insert the partial relation
155- if large_primes [ 3 ] not in fp :
156- fp [large_primes [ 3 ] ] = {}
155+ if small_p not in fp :
156+ fp [small_p ] = {}
157157
158- fp [large_primes [ 3 ]][ large_primes [ 4 ] ] = pair
158+ fp [small_p ][ big_p ] = pair
159159
160160 size_fp += 1
161161
162162 # If the largest prime has been seen, ie if both primes have already been seen
163163 else :
164- if node_component_fp [large_primes [3 ]] != node_component_fp [large_primes [4 ]]:
165- graph_fp [large_primes [3 ]].append (large_primes [4 ])
166- graph_fp [large_primes [4 ]].append (large_primes [3 ])
167164
168- connected_components_fp [node_component_fp [large_primes [3 ]]] = connected_components_fp [node_component_fp [large_primes [3 ]]].union (connected_components_fp [node_component_fp [large_primes [4 ]]])
165+ parent_small_p = parent_fp [small_p ]
166+ while parent_fp [parent_small_p ] != parent_small_p :
167+ parent_fp [parent_small_p ], parent_small_p = parent_fp [parent_fp [parent_small_p ]], parent_fp [parent_small_p ]
169168
170- for node in connected_components_fp [node_component_fp [large_primes [4 ]]]:
171- node_component_fp [node ] = node_component_fp [large_primes [3 ]]
169+ parent_big_p = parent_fp [big_p ]
170+ while parent_fp [parent_big_p ] != parent_big_p :
171+ parent_fp [parent_big_p ], parent_big_p = parent_fp [parent_fp [parent_big_p ]], parent_fp [parent_big_p ]
172172
173- pair [4 ].append (large_primes [4 ])
173+ if parent_small_p != parent_big_p :
174+ graph_fp [small_p ].append (big_p )
175+ graph_fp [big_p ].append (small_p )
176+ 177+ parent_fp [parent_big_p ] = parent_small_p
178+ 179+ pair [4 ].append (big_p )
174180 # Find where to insert the partial relation
175- if large_primes [ 3 ] not in fp :
176- fp [large_primes [ 3 ] ] = {}
181+ if small_p not in fp :
182+ fp [small_p ] = {}
177183
178- fp [large_primes [ 3 ]][ large_primes [ 4 ] ] = pair
184+ fp [small_p ][ big_p ] = pair
179185
180186 size_fp += 1
181187 else :
182- path_cycle = find_cycle_fp (graph_fp , large_primes [ 3 : 5 ])
188+ path_cycle = find_cycle_fp (graph_fp , [ small_p , big_p ])
183189 if len (path_cycle ) < 11 : cycle_len [len (path_cycle )- 2 ] += 1
184190 else : cycle_len [- 1 ] += 1
185191 combine_fp (pair ,pairs_used ,fp ,path_cycle ,divide_leading ,g )
186192 partial_found_fp += 1
187193
188- return pairs_used , fp , graph_fp , size_fp , index_component_fp , cycle_len , full_found , partial_found_fp
194+ return pairs_used , fp , graph_fp , size_fp , parent_fp , cycle_len , full_found , partial_found_fp
189195
190196def find_cycle_pf (graph , init ):
191197 if init [0 ] == (1 , 1 ): return DFS_pf (graph , init )
@@ -278,7 +284,7 @@ def combine_pf(pair, pairs_used, pf, path, divide_leading, g):
278284
279285 pairs_used .append (tmp )
280286
281- def handle_large_pf (pair , large_primes , pairs_used , pf , graph_pf , size_pf , connected_components_pf , node_component_pf , index_component_pf , g , divide_leading , cycle_len , full_found , partial_found_pf ):
287+ def handle_large_pf (pair , large_primes , pairs_used , pf , graph_pf , size_pf , parent_pf , g , divide_leading , cycle_len , full_found , partial_found_pf ):
282288 if large_primes [1 ] == 1 :
283289 tmp = (1 , 1 ) # [smallest_prime, r_smallest]
284290 pair [2 ] = [tmp ]
@@ -303,10 +309,8 @@ def handle_large_pf(pair, large_primes, pairs_used, pf, graph_pf, size_pf, conne
303309 graph_pf [tmp2 ] = {}
304310 graph_pf [tmp2 ][tmp [0 ]] = [tmp ]
305311
306- connected_components_pf [index_component_pf ] = set ((tmp , tmp2 ))
307- node_component_pf [tmp ] = index_component_pf
308- node_component_pf [tmp2 ] = index_component_pf
309- index_component_pf += 1
312+ parent_pf [tmp ] = tmp
313+ parent_pf [tmp2 ] = tmp
310314
311315 else :
312316 flag_small_prime = tmp in graph_pf
@@ -329,17 +333,14 @@ def handle_large_pf(pair, large_primes, pairs_used, pf, graph_pf, size_pf, conne
329333 else :
330334 graph_pf [tmp2 ][tmp [0 ]] = [tmp ]
331335
332- connected_components_pf [node_component_pf [tmp2 ]].add (tmp )
333- node_component_pf [tmp ] = node_component_pf [tmp2 ]
336+ parent_pf [tmp ] = tmp2
334337
335338 else : # If it has not been seen, create it in the graph
336339 graph_pf [tmp2 ] = {}
337340 graph_pf [tmp2 ][tmp [0 ]] = [tmp ]
338- 339- connected_components_pf [index_component_pf ] = set ((tmp , tmp2 ))
340- node_component_pf [tmp ] = index_component_pf
341- node_component_pf [tmp2 ] = index_component_pf
342- index_component_pf += 1
341+ 342+ parent_pf [tmp ] = tmp
343+ parent_pf [tmp2 ] = tmp
343344
344345 # If [smallest_prime, r_smallest] has already be seen
345346 # We look for [largest_prime, r_largest]
@@ -355,8 +356,7 @@ def handle_large_pf(pair, large_primes, pairs_used, pf, graph_pf, size_pf, conne
355356 graph_pf [tmp2 ] = {}
356357 graph_pf [tmp2 ][tmp [0 ]] = [tmp ] # Create the large prime in the graph
357358
358- connected_components_pf [node_component_pf [tmp ]].add (tmp2 )
359- node_component_pf [tmp2 ] = node_component_pf [tmp ]
359+ parent_pf [tmp2 ] = tmp
360360
361361 pair [2 ].append (tmp2 )
362362 # Find where to insert the partial relation
@@ -368,7 +368,15 @@ def handle_large_pf(pair, large_primes, pairs_used, pf, graph_pf, size_pf, conne
368368 size_pf += 1
369369
370370 else :
371- if node_component_pf [tmp ] != node_component_pf [tmp2 ]:
371+ parent_tmp = parent_pf [tmp ]
372+ while parent_pf [parent_tmp ] != parent_tmp :
373+ parent_pf [parent_tmp ], parent_tmp = parent_pf [parent_pf [parent_tmp ]], parent_pf [parent_tmp ]
374+ 375+ parent_tmp2 = parent_pf [tmp2 ]
376+ while parent_pf [parent_tmp2 ] != parent_tmp2 :
377+ parent_pf [parent_tmp2 ], parent_tmp2 = parent_pf [parent_pf [parent_tmp2 ]], parent_pf [parent_tmp2 ]
378+ 379+ if parent_tmp != parent_tmp2 :
372380 if tmp2 [0 ] in graph_pf [tmp ]:
373381 graph_pf [tmp ][tmp2 [0 ]].append (tmp2 )
374382 else :
@@ -379,10 +387,7 @@ def handle_large_pf(pair, large_primes, pairs_used, pf, graph_pf, size_pf, conne
379387 else :
380388 graph_pf [tmp2 ][tmp [0 ]] = [tmp ]
381389
382- connected_components_pf [node_component_pf [tmp ]] = connected_components_pf [node_component_pf [tmp ]].union (connected_components_pf [node_component_pf [tmp2 ]])
383- 384- for node in connected_components_pf [node_component_pf [tmp2 ]]:
385- node_component_pf [node ] = node_component_pf [tmp ]
390+ parent_pf [parent_tmp2 ] = parent_tmp
386391
387392 pair [2 ].append (tmp2 )
388393
@@ -395,10 +400,9 @@ def handle_large_pf(pair, large_primes, pairs_used, pf, graph_pf, size_pf, conne
395400
396401 else :
397402 path_cycle = find_cycle_pf (graph_pf , [tmp , tmp2 ])
398- #path_cycle = DFS_pf(graph_pf,[tmp, tmp2])
399403 if len (path_cycle ) < 11 : cycle_len [len (path_cycle )- 2 ] += 1
400404 else : cycle_len [- 1 ] += 1
401405 combine_pf (pair ,pairs_used ,pf ,path_cycle ,divide_leading ,g )
402406 partial_found_pf += 1
403407
404- return pairs_used , pf , graph_pf , size_pf , index_component_pf , cycle_len , full_found , partial_found_pf
408+ return pairs_used , pf , graph_pf , size_pf , parent_pf , cycle_len , full_found , partial_found_pf
0 commit comments